我设置为每分钟运行一次通知发送,
$ crontab -l 1 * * * * /usr/bin/notify-send -t 0 "hello"
为什么它不起作用?编辑 crontab 文件后是否需要重新启动操作系统?
下面的意思是不是
cron
正在运行?$ ps aux | grep -i cron root 1038 0.0 0.0 23660 2420 ? Ss Apr20 0:00 cron
我可以指定一个更频繁的时间表,例如 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
每一分钟,试试这个。