我的 cron 作业没有运行

我的 cron 作业没有运行
  1. 我设置为每分钟运行一次通知发送,

    $ crontab -l
    1 * * * * /usr/bin/notify-send -t 0 "hello"
    

    为什么它不起作用?编辑 crontab 文件后是否需要重新启动操作系统?

  2. 下面的意思是不是cron正在运行?

    $ ps aux | grep -i cron
    root      1038  0.0  0.0  23660  2420 ?        Ss   Apr20   0:00 cron
    
  3. 我可以指定一个更频繁的时间表,例如 30 秒吗?时间可以指定为小数吗?

    0.5 * * * * /usr/bin/notify-send -t 0 "hello"
    

答案1

你的第一个问题是你每分钟运行一个作业的语法是错误的:

1 * * * * /usr/bin/notify-send -t 0 "hello"

第一个字段中的1表示作业仅在每小时后 1 分钟运行。将其从 更改1*

* * * * * /usr/bin/notify-send -t 0 "hello"

第二个问题是 cron 作业在非常有限的环境中运行。在我的系统 (Linux Mint) 上,设置的唯一环境变量是$HOME$LOGNAME$PATH$LANG$SHELL$PWD-$PATH通常设置为"/usr/bin/:/bin"

至少,没有设置就$DISPLAY意味着notify-send无法显示任何东西。

快速实验:

* * * * * DISPLAY=:0.0 notify-send "hello from crontab"

导致了这个错误:

(notify-send:18831): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed

(我正在运行 Gnome 桌面。)

在另一个实验中,我将整个交互式环境复制到脚本中,然后编辑该脚本,以便它显式设置所有环境变量并调用notify-send.这确实有效;我现在每分钟都会收到一条弹出的“来自 crontab 的问候”消息。

我确定我不需要全部我的交互式环境可以让它工作,但我不知道到底需要哪些环境变量或者它们的值需要是什么。当当前登录会话启动时,很可能会设置一些所需的变量,并且如果我注销并再次登录,它们将会更改。详细信息也很可能会根据您使用的桌面环境而有所不同。

这不是一个完整的解决方案,但它应该为您提供一个起点 - 也许其他人可以添加相关细节。

答案2

你的cron工作几乎肯定是跑步。但是,您无法(轻松)与 GUI 进行交互,cron因此不幸的notify-send是会失败。

您可以通过如下修改该行来证明您的作业是否cron正在运行crontab

1 * * * * ( date; notify-send /usr/bin/notify-send -t 0 "hello"; echo ) >>cron.log 2>&1

这会将日期和notify-send命令的任何输出写入您的主目录中调用的日志文件cron.log中。

但请注意,正如从您的问题中复制的那样,这只会在每小时的第一分钟运行 ( 1 * * * *)。要每分钟运行一次,您需要使用* * * * *(“每分钟”而不是“第一分钟”)。感谢@KeithThompson 指出了这一点。

粒度为cron一分钟。如果您需要比这更频繁地运行作业,您可能需要考虑一个独立的守护进程,或者cron其中一行前面带有sleep 30.

答案3

$ crontab -l
*/1 * * * * /usr/bin/notify-send -t 0 "hello"

如果你想跑步cron每一分钟,试试这个。

相关内容