crontab에서 $ RANDOM 문제


9

cron에서 $ RANDOM에 이상한 문제가 있습니다. cronjob이 실행 된 후 무작위로 몇 분 동안 명령을 실행하고 싶습니다.

이 예제는 터미널에서 직접 작동하며 명령을 최대 30 초 지연시킵니다 (명령을 원하는대로 바꾸십시오. 실제로는 / dev / ttyUSB0에 대한 에코입니다).

sleep `expr $RANDOM \% 30` ; command

동일한 행이 crontab에 배치되면 명령은 항상 지연없이 즉시 실행됩니다.

* * * * * sleep `expr $RANDOM \% 30` ; command

$ RANDOM없이 표현식을 사용하면 정상적으로 작동합니다. 이는 15 초 지연됩니다.

* * * * * sleep `expr 10 + 5` ; command

즉, $ RANDOM이 크론에서 작동하지 않는 것 같습니다.

그러나 단순히 $ RANDOM 자체가 0으로 평가되기 때문이 아니라 10의 지연이 발생하기 때문입니다.

* * * * * sleep `expr $RANDOM \% 30 + 10` ; command

나는 또한 && instread of; 그러나 그것은 도움이되지 않습니다. 실제로 명령이 전혀 실행되지 않습니다!

물론 crontab에서 호출 된 스크립트에 지연을 배치 할 수는 있지만 문제를 설명하지 못하고 배우지 못합니다.

차이가 있다면 데비안 레니입니다.

답변:


18

cron/bin/sh셸을 사용하여 작업을 실행합니다. 일부 배포판에서 이는에 대한 심볼릭 링크 dash입니다. 둘 중 어느 것도 $RANDOM변수를 지원하지 bash않으며 , 이는 특정 확장자입니다.

  • vixie-cron을 사용하면 SHELL=/bin/bashcrontab 상단에 줄 을 넣을 수 있습니다 .

  • 그렇지 않으면 bash -c 'echo $RANDOM'또는 로 정착해야합니다 perl -e 'print int(rand(65535))'.

    (위의 예에서 65535는 반환 할 최대 수입니다. 스크립트 내에서 다른 수학을 적용 할 수도 있습니다.)

  • 올바르게 구성된 시스템에서는 cron자체적 으로이 정보를 알게되었을 것 입니다. 오류 메시지를 포함한 작업 출력을 항상 이메일로 보냅니다. 경량 MTA를 설치하십시오.


또한 bash에서는 $(( ))보다 선호됩니다 `expr`.


마지막으로 확인한 /bin/sh것은 실제 쉘이 아니며 데비안에서 sysadmin의 선호하는 쉘 (일반적으로 bash 또는 dash)에 대한 심볼릭 링크였습니다.
Hello71

1
@ Hello71 : 내가 게시물에서 말한 것입니다. 그럼에도 불구하고 시스템 소프트웨어는 일반적 /bin/sh으로 Bourne 쉘과 호환 될 것으로 예상됩니다. system()glibc 의 함수 가 그 예입니다 . 따라서 /bin/sh일반적으로 가장 빠른 Bourne 호환 쉘을 가리 킵니다 . 그리고 시스템 관리자는 해당 환경 설정 시스템 전체에 적용 할 수 없습니다, / etc / passwd에의 해당 라인에서 자신의 기본 설정을하도록되어
user1686

@ Hello71 : ... 좋아, 주로 내가 게시물에서 말한 것. (나는 대부분의 다른 배포판이에 링크 sh되어 있다는 것을 알고 bash있지만 관련성이없는 것 같습니다.)
user1686

당신 말이 맞아요 /bin/sh. 지금까지 나는 대시에 대해 들어 본 적이 없다. 나는 그것을 찾았고 bash의 가벼운 변형입니다. 또한 cron이 "파괴 된"환경에서 실행되었다는 것을 몰랐지만 과거에 있었던 다른 여러 가지 문제에 대해 설명합니다. Btw, 나는 사용하기 시작 $(())했지만 작동하지 않았기 때문에 모든 종류의 변형을 시도하고 결국 expr작동하지 않았습니다. 그러나 그것이 내가 끝난 곳입니다 :-) 사용하는 제한없이 정상적인 bash 쉘을 실행할 수 bash -c 'xxxx'있습니까? Btw, 주석에 줄 바꿈을 넣을 수 없습니까?
marlar

@marlar : 1) dash은 쉘입니다. 보다 평범하지 않습니다 bash. 그것의 변형도 아닙니다. 2) 답안 1 번과 2 번을보십시오.
user1686 년

2

cron일반적으로 덜 "전체"환경에서 실행됩니다. 즉, 사용 가능한 동일한 환경 변수가 많지 않습니다. 분명히 $RANDOM같은 하나이며, 실제로 당신의 sleep명령은 단순히 때문에 정의되지 않은 변수의 오류와 실패 - 당신의 명령을 사용하면로 전환 할 때 전혀 실행하지 못했습니다 왜 &&대신 ;. (실제로 $RANDOMBash 기능이지만 cron전체 Bash 환경에서 실행되지는 않지만이 기능이없는 것 같습니다.)

이 작업을 수행하려면 말한대로 별도의 Bash 스크립트를 사용해야합니다. 또는 명령 cat /dev/urandom에서 직접 사용하는 방법을 알아낼 수 cron있지만 현재 가지고있는 것을 별도의 Bash 스크립트로 옮기는 것이 더 쉬울 것입니다.


1
꽤 좋지는 않지만 귀하의 제안과 유사한이 솔루션을 발견했습니다. sleep $ (expr od -An -N1 -i /dev/urandom\ % 30); 명령
marlar

1
$RANDOM"전체"환경의 일부가 아닙니다. 프로세스 시작시 설정된 환경 변수와 관련이 없습니다. bash에서 "즉석에서"생성 된 특수 변수입니다. 변수를 읽을 때마다 항상 새 값이 생성됩니다. --- cron기본적으로 연결되어 있지 않은 /bin/sh시스템에서는 기본적으로 작동하지 않습니다. /bin/shbash $RANDOM
pabouk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.