如何从 cron 使用 gnome-session-save?

如何从 cron 使用 gnome-session-save?

我正在尝试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 等)

http://webcache.googleusercontent.com/search?q=cache:jdM1kg3ituMJ:https://help.ubuntu.com/community/CronHowto+https://help.ubuntu.com/community/CronHowto%23GUI%2520Applications&cd= 1&hl=en&ct=clnk&gl=us&source=www.google.com

是的,我使用了谷歌网络缓存,因为我无法正确加载页面=D。

答案3

作为帕维尔·谢利瓦诺夫指出在这文章有必要通过 cronjob设置DBUS_SESSION_BUS_ADDRESS并启用与 GUI 相关的任务。DISPLAY

他编写了一个 shell 脚本,适用于DBUS_SESSION_BUS_ADDRESSXFCE、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

我不知道为什么。 :|欢迎编辑。

相关内容