스크립트는 crontab을 통해 실행되지 않지만 독립적으로 작동합니다.


51

uptime3 일 이상 이면 내 컴퓨터를 다시 시작하도록 상기시키는 스크립트 가 있습니다 (이제 0 일로 설정되어 있어도 컴퓨터가 하루 이상 가동 된 상태인지 스크립트가 실행되고 있는지 확인하기 만합니다.).

나는 그것이 가장 우아한 스크립트가 아니라는 것을 알고 있지만 노력하고 있습니다! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

나는 그것을 실행 가능하게 만들었 chmod + x checkup.sh으며 터미널을 통해 실행할 때 정상적으로 작동합니다../checkup.sh

이 스크립트에 대한 crontab 항목은 다음과 같습니다.

46 14 * * * /home/username/Desktop/./checkup.sh

매일 14:46 시간에 운행됩니다.

정말 ... 어리석지 않은 것이 아니라면 실행해야한다고 생각합니다. 또한이 bash 스크립트를 옮길 수 있다고 생각 /bin합니까?


1
패키지가 생각하는 곳을 막지 않도록 일반적인 모범 사례로 / opt / bin 또는 ~ / bin에 넣습니다.
RobotHumans

스크립트를 다음과 같이 실행하면 /home/dnaneet/Desktop/./checkup.sh가 작동합니까? 나는 /home/dnaneet/Desktop/checkup.sh
LnxSlck를

@LnxSlck 네, /home/dnaneet/Desktop/./checkup.sh잘 작동합니다. 그러나 /home/dnaneet/Desktop/checkup.sh제대로 작동하지 않을 수 있습니까? 그것이 필요하기 때문에 ./?
dearN

1
나는 cron이 X 세션에 대해 아무것도 모른다고 생각합니다.
glenn jackman

@glennjackman 그래서 그것은 무엇을 의미합니까? crontab을 통해 이러한 스크립트를 실행하면 그놈 환경에 팝업 메시지가 표시되지 않습니까?
dearN

답변:


71

한 번에 한 가지 :

먼저 사용자 기반 bin 폴더를 제공하겠습니다.

cd ~/ && mkdir bin

crontab을 사용하려고합니다. 정말 간단한 것으로 시작합시다.

* * * * * touch /tmp/testing.txt

좋아요, 그래서 작동합니다

이제 똑같은 스크립트를 실행 해 봅시다

* * * * * /home/username/bin/touchtest.sh

작동 할 때까지 1 분에 한 번 실행
아니오 라인 중간에 ./가 필요하지 않습니다. ./는 상대 URL을 제공 할 때 사용됩니다.
좋아요, 그래서 작동합니다

이제 xmessage를 호출하는 스크립트를 실행 해 봅시다

* * * * * /home/username/bin/rebootwarn.sh

작동 안함

먼저 환경 변수에 의존 할 필요가 없습니다. 여기에는 경로 설정, x11 설정 또는 기타 모든 것이 포함됩니다 (파이썬 및 루비 환경 변수가 떠 오릅니다 ...)

anacron의 적절한 cron 파일과 비슷하게 보이도록하겠습니다. 테스트로 저장했습니다.

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

1 분에 한 번 실행되도록 설정

crontab test 가져 오기

스크립트에

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

좋아, 그래서 작동합니다 ... 우리는 무엇을 했습니까?
명시 적으로 설정하지 않은 경로에 의존하지 않도록 모든 명령을 변경
했습니다. bash를 사용하여 스크립트를 명시 적으로 실행
했습니다. DISPLAY : 0.0에있을 것이라고 스크립트에 알려주었습니다.


답변 해주셔서 감사합니다. 당신은 "우리를 anacron의 적절한 크론 파일처럼 보이게 만들자. 나는 이것을 테스트로 저장했다"고 말했다. crontab 파일? :-/
dearN

여기 내가 관찰 한 것입니다. 먼저 =줄을 지정 하기 전후에 공백을 제거해야했습니다 DISPLAY. 둘째, crontab 파일을 편집 PATH하고 제안대로 추가하고 나중에 실행할 시간을 설정했을 때 팝업 창이 표시되지 않았습니다. 그러나 /bin/bash...를 사용하여 스크립트를 실행할 때 팝업 창이 잘 표시되었습니다 .
dearN

스크립트를로 변경 export DISPLAY=:0.0하면 제대로 작동합니다. 팝업 창이 표시되어야 할 시간을 시계가 울린 후 약 5 초 정도의 상당한 언어가 있었지만 ... 제안 사항이 있습니까? 그러나 그렇습니다, 당신의 대본 수정 작업!
dearN

5 초 지연에 대해서는 전혀 모른다.
RobotHumans

3
이 단계를 단계별로 진행 한 다음 요약 한 방식이 마음에 듭니다. 감사합니다!
jbobbins

10

문제가 해결되었습니다. Google의 설명서를 읽으십시오.

기술:

  1. #!/bin/bash헤더로 사용 하는 스크립트가 있습니다
  2. 나는 대본을 썼다 /home/wc3/palert/

분석:

  1. crontab에서 스크립트를 실행할 수 없습니다
  2. 그러나 수동으로 실행하면 출력이 표시되고 웹에서 결과를 볼 수 있습니다
  3. 그것은 스크립트 폴더에서 스크립트를 실행할 때 crontab이 환경을 좋아할 수 없다는 것을 의미합니다.

대답:

  1. 아래 줄을 사용하여 환경을 스크립트에 넣으십시오.

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    이것을 바꾸십시오 : /home/wc3/palert
    with : 스크립트를 넣은 장소, 예./home/budi/script.sh

견본:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

스크립트를 crontab에 넣으십시오.


나를 위해 작동하지 않습니다
John Joe

나를 위해 매력처럼 일하십시오!
1rq3fea324는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.