应在终端窗口中执行的 Crontab 和 C 程序

应在终端窗口中执行的 Crontab 和 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 

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以应用该作业。等待大约一分钟即可看到结果。

参考:

演示 - 我刚刚创建了一个简单的 C 程序(这是我的第一次尝试)来检查这一切是如何工作的:

在此处输入图片描述

相关内容