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명령( )에 대한 전체 경로도 시도했지만 운이 없었습니다.

우분투 10.04LTS

답변1

우선, sudo crontab -e이런 목적으로 사용해서는 안 됩니다. 그러면 루트 사용자의 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

이유는 모르겠습니다. :|편집자 여러분을 환영합니다.

관련 정보