cronでgnome-session-saveを使用する方法は?

cronでgnome-session-saveを使用する方法は?

gnome-session-save --killcrontabを介してコマンドを実行しようとしています。私はコマンドを使用しました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 ファイルが編集されます。保存されたgnomeセッションがあなたに属するように、ユーザーcrontabでそれを実行する必要があります。 sudoを削除して実行しますcrontab -e。必要に応じて、cron.allowcrontabファイルをユーザーとして所有できるように、ファイルに自分自身を追加します。 (また、ルートのcrontabを再編集してこのエントリを削除することを忘れないでください。)

次に、正しい変数に接続しないと、cronはgnomeユーティリティなどの機能を実行できません$DISPLAY。 cronが子に渡す環境はログインシェルほど完全ではなく、グラフィカルログイン環境では実行されないため接続されません。次の点を考慮してください。複数のグラフィック環境を実行できます。システムスクリプトはどのスクリプトを操作したいのかをどうやって知ることができますか?しかし、実際にはそうではありません。どのモニターで実行されているかを特定し、それをコマンドに渡す必要があります。

結局、ここはとにかく間違った場所のようです。一体なぜ定期的にセッションを終了したいのですか?その瞬間、ユーザーが行ったすべての操作は破壊されます。また、cronはユーザーがログインしているかどうかに関係なく実行されるため、常にアクション可能なエントリがない可能性があります。

答え2

Calebは正しい表示変数を渡すことについて正しいです。また、SUDOの代わりにcrontab -eを使用します。 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

はい、ページを正しく読み込めず、Google Web Cacheを使用しました= D。

答え3

〜のようにパベル・セリヴァノフここを指摘してください記事DBUS_SESSION_BUS_ADDRESScronjobを介してGUI関連タスクを設定して有効にする必要があります。DISPLAY

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

同様のエラーを見たことがあります。コマンドをシェルスクリプトに入れ、シェルスクリプトをcronに追加すると機能します。次のようなものを作成します。killGnome.sh

#!/bin/sh
gnome-session-save --kill

上記で実行権限を付与したことを確認してください。次に、crontabに以下を追加します。

00 00 * * * /path/to/killGnome.sh

理由はわかりません。 :|編集者を歓迎します。

関連情報