应该执行到终端窗口的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程序(这是我的第一次尝试)来检查所有这些是如何工作的:

在此处输入图像描述