저는 Ubuntu 12.04와 bash를 실행하고 있습니다. 나는 알람이 울린 후 자동으로 설정이 해제되는 알람을 설정할 수 있는 두 개의 쉘 스크립트를 작성했습니다. 첫 번째는 alarmset
시간을 입력하고 사용자의 crontab에서 경고 줄을 수정할 수 있게 해줍니다. 이 줄은 alarmring
브라우저 창에서 브로드캐스트 플레이어를 시작한 다음 crontab에서 경고 줄을 주석 처리하는 두 번째 스크립트를 시작합니다.
alarmring
비정상적인 행동. 직접 실행하면 브라우저 창을 시작하고 crontab을 편집하는 두 가지 작업을 수행합니다. 그런데 을 실행하면 지정된 시간에 alarmset
crontab이 시작되면 crontab은 편집되지만 브라우저 창이 실행되지 않습니다.alarmring
alarmring
마지막으로 crontab을 실행하면 명령 alarmring
을 무시 set -x
하지만 직접 실행하면 set -x
명령이 실행됩니다. 따라서 crontab이 처음 10줄을 건너뛴 것과 같습니다.
무슨 일이 일어났는지 생각이 나나요? 아래에 두 개의 스크립트와 crontab을 붙여넣겠습니다.
알림 설정:
#!/bin/bash
# alarmset
set -x
usage()
{ echo "alarmset [ hour minute | -h ]" }
editcrontab()
{
echo $'/alarmring/s/^\(.*\)\(\* \* \*\)/'$2$' '$1$' \\2/' > ~/Documents/crontab_script.txt
crontab -l | sed --file=/home/username/Documents/crontab_script.txt > ~/Documents/new_crontab.txt crontab ~/Documents/new_crontab.txt
}
### MAIN
case $# in
2 ) editcrontab $1 $2 ;;
* ) usage
exit ;;
esac
set +x
사이렌:
#!/bin/bash
# alarmring
set -x
env DISPLAY=:0
# Ring the alarm : launch BBC World Service in Firefox
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service
# Unset the alarm : comment out the alarm line in the crontab
crontab -l | sed '/alarmring/s/^/#/1' > ~/Documents/new_crontab.txt
crontab ~/Documents/new_crontab.txt
set +x
예약 된 일들:
SHELL=/bin/bash
PATH=~/bin:/usr/bin:/bin
#
# m h dom mon dow command
53 07 * * * /home/username/bin/alarmring
답변1
GUI 프로그램을 실행하려면 환경 변수를 설정해야 하며 DISPLAY
, XAUTHORITY
환경 변수도 설정해야 할 수도 있습니다. 바라보다
원격 X 모니터에서 창 열기("모니터를 열 수 없습니다" 이유)?더 많은 정보를 알고 싶습니다.
~
이는 홈 디렉토리가 쉘 기능이므로 crontab에서 사용할 수 없음을 의미합니다. 같은 이유로 HOME
홈 디렉터리의 전체 경로를 사용할 수 없습니다.
PATH=/home/username/bin:/usr/bin:/bin
bash를 쉘로 사용하는 것은 ~
bash가 확장되었기 때문에 실제로 작동합니다 ~
. PATH
그러나 이것은 bash에 있어서 이상한 점이며 다른 쉘이나 다른 프로그램은 이런 식으로 작동하지 않습니다.
이 명령은 으로 설정된 경우를 제외하고 env DISPLAY=:0
현재 환경을 표시합니다 . 그건 소용없어요. 아마도 .DISPLAY
:0
export DISPLAY=:0
당신의 합의는 복잡합니다. Cron은 반복적인 작업을 위해 설계되었습니다. 백그라운드 작업을 한 번만 예약하려면 다음을 사용하세요.존재하다.
at 7:53 <<EOF
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service
EOF
At는 DISPLAY
환경 변수를 보존하므로 at
GUI에서 명령을 실행하고 Firefox가 창을 표시하도록 하려면 이를 수동으로 설정할 필요가 없습니다.
답변2
시스템 crontab( /etc/crontab
) 또는 디렉토리( /etc/cron.d
- 또는 - 등) /etc/cron.hourly
의 항목은 루트로 실행됩니다. 기본적으로 루트는 특정 사용자의 모니터에 액세스할 수 없습니다.
crontab 항목을 생성하려면 crontab을 추가하는 사용자 기능을 사용하는 것이 좋습니다. 이는 crontab -e
지정된 사용자로 로그인한 셸에서 명령을 사용하여 수행할 수 있습니다 .
이 명령은 텍스트 편집기(일반적 으로 또는 ) crontab -e
를 열고 시스템 파일에 항목을 추가하는 것과 동일한 구문을 사용하여 항목을 추가 할 수 있습니다.vi
vim
/etc/crontab
이것튜토리얼에서는 crontab 앙상블을 추가하는 기본 사항을 다룹니다..
또한 사용자의 crontab을 추가하고 스크립트가 모니터에 액세스해야 하는 경우 (GUI를 시작한다고 가정) GUI가 올바른 모니터로 연결되도록 crontab -e
환경 변수( )를 설정해야 합니다 .export DISPLAY=:0.0
예를 들어
% crontab -e
그리고 다음 줄을 추가하세요:
53 07 * * * export DISPLAY=:0.0;/home/username/bin/alarming
답변3
$ xauth extract - :0 | sudo xauth -f /root/.Xauthority merge -
또한 다른 터미널에서도 실행되므로 다음이 필요합니다.
$ DISPLAY=:0 xclock