我需要在 Ubuntu 18.04 上通过 cron 运行一个脚本,myscript.sh
除其他外,我希望在运行时向用户显示一条消息,以便他知道 cron 正在运行(也许也有方法可以做到这一点,而不涉及任何与 GUI 相关的事情;如果是,请告诉我)。
但是由于 cron 在其自己的最小环境中运行,我无法弄清楚如何做到这一点。
我尝试了各种方法,最有希望的方法似乎是明确分配 DISPLAY 并启动一个分配有此显示的终端,然后在该终端内运行显示消息的命令,这意味着myscript.sH
我有两行
export DISPLAY=:0 XAUTHORITY=~/.Xauthority
gnome-terminal --display=:0.0 -- bash -c "xmessage -center -timeout 10 'ATTENTION. CRON IS RUN';exec bash"
当我在自己的终端中运行时,无需 cron 参与,gnome-terminal --display=:0.0 -- bash -c "xmessage -center -timeout 10 'ATTENTION. CRON IS RUN';exec bash"
这就可以工作(当然,在我的终端中,我不需要启动另一个终端,只需运行xmessage -center -timeout 10 'ATTENTION. CRON IS RUN'
...)。
但是 cron 抱怨以下消息(我正在将 cron 执行的输出重定向到文件,以便我可以看到出了什么问题):
No protocol specified
Unable to init server: Could not connect: Connection refused
如果我改为放入xmessage -center -timeout 10 'ATTENTION. CRON IS RUN'
,myscript.sh
cron 会抱怨
No protocol specified
Error: Can't open display: :0
我如何才能显示此命令或任何其他 GUI 消息?我并不关心通过哪个系统显示消息,只要提醒用户即可某种程度上来说现在 cron 正在被执行。
编辑最后我找到了适合我目的的软件,叫做 Zenity,它可以显示带有 的文本zenity --info --text="test"
。
答案1
您可以使用该notify-send
应用程序向已登录用户的桌面发送通知。此程序包含在软件包中libnotify-bin
。
例如:
notify-send --icon install "Cron job" "It's done, boss"
您可能希望将其置于后台。在我的测试中,我发现如果当时没有用户登录,它会挂起。这可能只是我的版本中的一个错误,但您应该为出错做好准备。
答案2
如果您想使用自定义 XDISPLAY 运行任何程序:
- 运行例如
DISPLAY=:0.0 mycomand
或DISPLAY=127.0.0.1:0.0 mycomand
- 在 cron 中:*/20 * * * * /bin/bash -c 'DISPLAY=:0:0 mycomand'
- 要访问显示,请设置 xhost(例如
xhost +127.0.0.1
) - 可能需要复制/修复 XAuthority cookie(https://stackoverflow.com/questions/37157097/how-does-x11-authorization-works-mit-magic-cookie)