IDK*_*IDK 2 cron gnome-terminal c
我想创建 Cron 作业来运行编译.c文件。假设program.c我的桌面上有一个名为 的文件。我使用 编译它gcc program.c,它创建了a.out可执行文件。
我想在某个时间通过 Cron 打开一个终端并在a.out里面运行以将其输出显示到终端中。我已经打开 Crontab 进行编辑 - crontab -e- 我试过:
30 * * * * /home/username/Desktop/a.out /Desktop/a.out
Run Code Online (Sandbox Code Playgroud)
和
30 * * * * cd /home/username/Desktop/a.out && ./a.out
Run Code Online (Sandbox Code Playgroud)
和
30 * * * * /bin/sh /home/username/Desktop/a.out
Run Code Online (Sandbox Code Playgroud)
和
30 * * * * bash -c "exec /home/username/Desktop/a.out"
Run Code Online (Sandbox Code Playgroud)
没有任何作用!
如果可执行文件生成了一个输出文件,或者只是修改了一些东西,那么 Cron 作业应该是:
* * * * * /home/<user>/Desktop/a.out
Run Code Online (Sandbox Code Playgroud)
如果程序内部的路径是相对的,则应正确定义它们的原点,否则输出文件将被放置到$HOME目录中$HOME/Desktop,例如,放置在目录中,而不是,您假设的位置。这是一个常见的错误。
如果程序不写入任何输出文件而只是在stdout 中生成一些数据,则应将其重定向到一个文件以将其查看到适当的位置(这部分2>&1重定向并将错误消息重定向到 stdout):
* * * * * /home/<user>/Desktop/a.out >> /home/<user>/Desktop/a.out.log 2>&1
Run Code Online (Sandbox Code Playgroud)
虽然标准输出不重定向,克朗将发送本地邮件给用户,除非这是通过设置变量覆盖MAILTO在crontab:
MAILTO="my@custom.mail"
* * * * * /home/<user>/Desktop/a.out
Run Code Online (Sandbox Code Playgroud)
通过 Cron 执行 GUI 应用程序是一项更困难的任务,因为 Cron 不是为与 GUI 一起工作而设计的。应该导出很少的环境变量,最好的方法是创建一个额外的启动脚本。以下是如何在 Ubuntu Unity/Gnome 中执行此操作的示例:
编写脚本。让我们假设它也位于~/Desktop目录中并被称为a-cron.sh. 不要忘记使它可执行 - chmod +x a-cron.sh。该脚本应如下所示:
#!/bin/sh
# Set the necessary environment variables - UBUNTU/UNITY/GNOME:
export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')
export GNOME_DESKTOP_SESSION_ID=true
export DBUS_SESSION_BUS_ADDRESS=$(sed -zne 's/^DBUS_SESSION_BUS_ADDRESS=//p' /proc/`pgrep gnome-session -U $(id -u)`/environ)
#Open new terminal and execute the script:
/usr/bin/gnome-terminal -x sh -c '/home/<user>/Desktop/a.out; exec bash'
Run Code Online (Sandbox Code Playgroud)
该部分exec bash旨在在执行后保持终端窗口打开a.out- 还有其他可用的方法,在此处进行描述。
现在创建用户的 Cron 作业 - crontab -e- 如下:
* * * * * /home/<user>/Desktop/a-cron.sh > /home/<user>/Desktop/a-cron.log 2>&1</pre>
Run Code Online (Sandbox Code Playgroud)
与上一节不同,日志文件在这里扮演不同的角色。执行时的错误消息a-cron.sh应该写在里面a-cron.log——所以如果一切正常,它必须是空的。
保存并关闭crontab以应用作业。等待大约一分钟以查看结果。
参考:
在这个问题中OP使用root的Crontab,但这不是一个好主意,因为在这种方法中,内部某些文件和目录的所有权/run/user/<uid>/dconf/会发生变化,因此会产生很多错误。
如何在未设置 DISPLAY 时以编程方式查找 DISPLAY 的当前值?(用于crontab) |如何获取X分配给我的显示编号
演示 - 我刚刚创建了一个简单的 C 程序(这是我的第一次尝试)来检查所有这些是如何工作的:
| 归档时间: |
|
| 查看次数: |
4414 次 |
| 最近记录: |