이상한 crontab 스크립트 상호작용(bash)

이상한 crontab 스크립트 상호작용(bash)

저는 Ubuntu 12.04와 bash를 실행하고 있습니다. 나는 알람이 울린 후 자동으로 설정이 해제되는 알람을 설정할 수 있는 두 개의 쉘 스크립트를 작성했습니다. 첫 번째는 alarmset시간을 입력하고 사용자의 crontab에서 경고 줄을 수정할 수 있게 해줍니다. 이 줄은 alarmring브라우저 창에서 브로드캐스트 플레이어를 시작한 다음 crontab에서 경고 줄을 주석 처리하는 두 번째 스크립트를 시작합니다.

alarmring비정상적인 행동. 직접 실행하면 브라우저 창을 시작하고 crontab을 편집하는 두 가지 작업을 수행합니다. 그런데 을 실행하면 지정된 시간에 alarmsetcrontab이 시작되면 crontab은 편집되지만 브라우저 창이 실행되지 않습니다.alarmringalarmring

마지막으로 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:0export DISPLAY=:0

당신의 합의는 복잡합니다. Cron은 반복적인 작업을 위해 설계되었습니다. 백그라운드 작업을 한 번만 예약하려면 다음을 사용하세요.존재하다.

at 7:53 <<EOF
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service
EOF

At는 DISPLAY환경 변수를 보존하므로 atGUI에서 명령을 실행하고 Firefox가 창을 표시하도록 하려면 이를 수동으로 설정할 필요가 없습니다.

답변2

시스템 crontab( /etc/crontab) 또는 디렉토리( /etc/cron.d- 또는 - 등) /etc/cron.hourly의 항목은 루트로 실행됩니다. 기본적으로 루트는 특정 사용자의 모니터에 액세스할 수 없습니다.

crontab 항목을 생성하려면 crontab을 추가하는 사용자 기능을 사용하는 것이 좋습니다. 이는 crontab -e지정된 사용자로 로그인한 셸에서 명령을 사용하여 수행할 수 있습니다 .

이 명령은 텍스트 편집기(일반적 으로 또는 ) crontab -e를 열고 시스템 파일에 항목을 추가하는 것과 동일한 구문을 사용하여 항목을 추가 할 수 있습니다.vivim/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

관련 정보