我想创建 Cron 作业来运行已编译的.c
文件。假设program.c
我的桌面上有一个名为的文件。我使用 对其进行编译gcc program.c
,这将创建a.out
可执行文件。
我想通过 Cron 在特定时间打开一个终端并a.out
在里面运行以将其输出显示到终端中。我已打开 Crontab 进行编辑 - crontab -e
- 并且我已尝试:
30 * * * * /home/username/Desktop/a.out /Desktop/a.out
和
30 * * * * cd /home/username/Desktop/a.out && ./a.out
和
30 * * * * /bin/sh /home/username/Desktop/a.out
和
30 * * * * bash -c "exec /home/username/Desktop/a.out"
什么也没起作用!
答案1
如果可执行文件生成输出文件,或者仅修改某些内容,则 Cron 作业应该是:
* * * * * /home/<user>/Desktop/a.out
如果程序中的路径是相对的,则应正确定义它们的原点,否则输出文件将被放置在目录中,$HOME
而不是$HOME/Desktop
您假设的目录中。这是一个常见的错误。
如果程序不写入任何输出文件而只是在标准输出, 你应该重定向将其保存到文件中以将其放入适当的位置(此部分2>&1
将错误消息重定向至标准输出):
* * * * * /home/<user>/Desktop/a.out >> /home/<user>/Desktop/a.out.log 2>&1
虽然 stdout 没有重定向,但 Cron 会发送本地邮件对于用户,除非通过设置变量MAILTO
来覆盖crontab
:
MAILTO="[email protected]"
* * * * * /home/<user>/Desktop/a.out
通过 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'
该部分
exec bash
旨在执行后保持终端窗口打开a.out
- 还有其他可用的方法,如下所述这里。现在创建用户的 Cron 作业 -
crontab -e
- 如下所示:* * * * * /home/<user>/Desktop/a-cron.sh > /home/<user>/Desktop/a-cron.log 2>&1</pre>
与上一节不同,日志文件在这里起着不同的作用。执行过程中产生的错误信息
a-cron.sh
应写入其中a-cron.log
- 因此如果一切正常,它必须是空的。保存并关闭
crontab
以应用该作业。等待大约一分钟即可看到结果。
参考:
在这个问题OP使用了root的Crontab,但这不是一个好主意,因为这种方法会改变里面一些文件和目录的所有权
/run/user/<uid>/dconf/
,从而产生很多错误。如何在启动/重新启动计算机时打开一个(或多个)带有几个选项卡的 gnome-terminal 窗口,每个选项卡都有不同的配置文件?
当 DISPLAY 未设置时,如何以编程方式查找 DISPLAY 的当前值?(用于 crontab)|
如何获取 X 分配给我的显示号码
演示 - 我刚刚创建了一个简单的 C 程序(这是我的第一次尝试)来检查这一切是如何工作的: