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