我正在尝试gnome-session-save --kill
通过 crontab 发出命令。我用了命令sudo crontab -e
。文件中是这样的:
PATH=/usr/bin
00 00 * * * gnome-session-save --kill
该命令没有按预期运行。/var/log/syslog
但是显示它运行成功。
在命令中,我还尝试了命令(/usr/bin/gnome-session-save --kill
)的完整路径,但也没有任何运气。
Ubuntu 10.04LTS
答案1
首先,您不应该用于sudo crontab -e
此目的。这将为 root 用户编辑 crontab 文件。您需要在您的用户 crontab 中运行它,以便保存的 gnome 会话属于您。删除 sudo 并运行crontab -e
。如有必要,请将您自己添加到该cron.allow
文件中,以便您可以作为您的用户拥有 crontab 文件。 (还记得再次编辑 root 的 crontab 并删除该条目。)
其次,如果不将它们与正确的变量连接起来,就无法从 cron 运行诸如 gnome 实用程序之类的东西$DISPLAY
。 cron 传递给其子级的环境并不像登录 shell 那样完整,并且由于它不在图形登录环境中运行,因此它没有连接到它。考虑这一点:可以运行多个图形环境。系统脚本如何知道您要操作哪一个?事实并非如此。您需要弄清楚它正在运行的显示器并将其传递给您的命令。
最后,无论如何,这似乎都是错误的地方。你到底为什么要定期终止一个会话?用户在那一刻所做的任何事情都将被摧毁。此外,无论用户是否登录,cron 都会运行,因此它甚至可能并不总是有任何可操作的内容。
答案2
Caleb 关于传递正确的显示变量的说法是正确的。我还使用 crontab -e 而不是 SUDOing 它。在 Ubuntu 中,您所要做的就是指定在 Crontab 中传递哪个显示。所以我的命令如下所示:
00 18 * * * env DISPLAY=:0 gnome-session-save --kill
env DISPLAY=:0 告诉将 cronjob 传递到当前显示器(桌面)。或者,如果您有多个显示器,则可以使用小数指定要传递到哪个显示器(0.0 = 显示 1、0.1=显示 2 等)
是的,我使用了谷歌网络缓存,因为我无法正确加载页面=D。
答案3
作为帕维尔·谢利瓦诺夫指出在这文章有必要通过 cronjob设置DBUS_SESSION_BUS_ADDRESS
并启用与 GUI 相关的任务。DISPLAY
他编写了一个 shell 脚本,适用于DBUS_SESSION_BUS_ADDRESS
XFCE、Gnome、Unity、Cinnamon 和 KDE。我可以确认它可以在ubuntu:16.04
.
$ sudo nano /usr/local/bin/gui-cron
#!/bin/sh
[ "$#" -lt 1 ] && echo "Usage: $0 program options" && exit 1
program="$1"
shift
user=$(whoami)
env_reference_process=$( pgrep -u "$user" xfce4-session || pgrep -u "$user" cinnamon-session || pgrep -u "$user" gnome-session || pgrep -u "$user" gnome-shell || pgrep -u "$user" kdeinit )
export DBUS_SESSION_BUS_ADDRESS=$(cat /proc/"$env_reference_process"/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS= | sed 's/DBUS_SESSION_BUS_ADDRESS=//')
export DISPLAY=$(cat /proc/"$env_reference_process"/environ | grep -z ^DISPLAY= | sed 's/DISPLAY=//')
"$program" "$@"
然后,可以使用 crontab 语法创建一个按给定计划运行的用户 cronjob。例如,22:00 至 05:59 之间每 15 分钟一次:
$ crontab -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/15 22-23,00-05 * * * gui-cron gnome-session-quit --power-off
答案4
我见过类似的错误。如果您只将该命令放入 shell 脚本中,然后将该 shell 脚本添加到 cron 中,它就会起作用。创建类似的东西killGnome.sh
#!/bin/sh
gnome-session-save --kill
确保您授予上述执行权限。然后在你的 crontab 中添加以下内容:
00 00 * * * /path/to/killGnome.sh
我不知道为什么。 :|欢迎编辑。