스크립트는 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.