测试.sh:/usr/bin/notify-send "test"
以下工作:bash ~/Documents/test.sh
但是 crontab 从未显示通知。为什么?
*/1 * * * * bash ~/Documents/test.sh
答案1
要从 Cron 执行任何与 GUI 相关的应用程序,您应该导出一些桌面环境变量。以下解决方案是基于这个答案哪里提供了更多详细信息。
如何crontab
在 Ubuntu 16.04、17.10、18.04 和其他带有 Gnome 的 Ubuntu 发行版中启动任何 GUI 相关应用程序
创建一个启动脚本,它将导出桌面环境变量并启动您的应用程序。我们将其命名为gui-launcher
。其内容应为(参考文献:[1],[2]和[3]):
#!/bin/bash -e
# NAME: gui-launcher
# Check whether the user is logged-in
while [ -z "$(pgrep gnome-session -n -U $UID)" ]; do sleep 3; done
# Export the current desktop session environment variables
# Sometimes it try to change $UID so we must remove -e option or use 2>/dev/null
export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ") 2>/dev/null
# Execute the input command
nohup "$@" >/dev/null 2>&1 &
exit 0
- 对于其他桌面环境,请
gnome-session
在此部分中将其更改$(pgrep gnome-session -n -U $UID)
为正在使用的 DE 进程的名称,例如mate-session
。Ubuntu 最常用的 DE 列表如下此处介绍. Lubuntu 执行同样的脚本 -这里。该脚本可用于从当前用户的桌面会话中的 TTY 或 SSH 会话启动 GUI 应用程序。 - 使文件可执行:
chmod +x gui-launcher
。 - 该脚本将一直工作直到用户登录,包括锁定屏幕。
- 请不要以 root 身份修改和运行脚本。这可能会对系统造成危害!
crontab
然后按以下方式使用它:
*/1 * * * * /full/path/to/gui-launcher "/full/path/to/the-target-application"
以下是它在 Wayland 上的 Ubuntu 17.10 上的运行方式:
下面给出了通过 SSH 实现的相同脚本:通过 ssh 连接到 Ubuntu 16.04 服务器后,如何在新终端中运行脚本(.sh)文件?
这里提供更多解释:重启时运行 Python 脚本的 Cron 作业不起作用。
再举一个例子:使用 xrandr 和 cron job 调整亮度
答案2
cron 的环境和常规用户的环境可能不同。
当您在 cron 中使用任何脚本时最好为其提供完整路径。