cron에서 SHELL에 두 개의 쉘을 할당해도 괜찮습니까?

cron에서 SHELL에 두 개의 쉘을 할당해도 괜찮습니까?

최근에 나는 점차적으로 쉘을 다음으로 전환하기 시작했습니다.화난 이 때문에 cron에서 SHELL에 경로를 할당하는 것을 고려했습니다.

대부분의 매뉴얼을 읽은 후 man 5 crontabPATH를 보고 :SHELL에 값을 할당하려는 두 쉘 사이에서 사용하는 규칙을 복사했습니다.

SHELL=/bin/bash:/home/jerzy/.cargo/bin/nu

작동하지 않습니다. 내 crontab의 스크립트가 제대로 작동하지 않습니다. 그리고 둘 다 잘 SHELL=/bin/bash작동합니다 SHELL=/home/jerzy/.cargo/bin/nu.

SHELL에 두 개의 쉘을 할당할 수 있나요? 이게 말이 돼?

답변1

아니요, 두 개의 쉘을 할당할 수 없습니다 SHELL. cron시작할 쉘을 알아야 하며 하나만 있을 수 있습니다. 변수가 지정 SHELL되지 않았습니다.crontab가능한지정하는 쉘이것사용할 쉘. (있는 경우) cron값을 읽고 SHELL이를 실행 명령으로 사용합니다. 해석 :하거나 다른 기호는 사용하지 않습니다.

폴백도 작동하지 않습니다. 어떤 이유로 인해 실패하면 이유 때문에 실패 했는지 nu아니면 다른 이유로 실패했는지 cron알 방법이 없습니다 . nu대부분의 스크립트는 주어진 인터프리터(shebang에 지정됨)에 대해 작성되며 하나의 인터프리터를 사용하여 스크립트를 실행한 다음 다른 인터프리터를 사용하여 실행할 수 없습니다. 마찬가지로 항목은 지정된(기본값이 아닌 경우 ) 염두에 두고 crontab작성됩니다 .SHELL/bin/sh

답변2

아니요, SHELL다음과 같은 이유로 여러 개의 쉘을 갖는 것은 의미가 없습니다.@Stephen은 답변에 설명되어 있습니다.. 그러나 이 변수는 적어도 Linux 시스템에서 일반적으로 사용되는 Vixie cron에서 행의 즉각적인 명령 부분을 실행하기 위해 SHELL셸이 사용하는 항목만 제어합니다 . .croncrontabSHELLcrontab데비안 매뉴얼 페이지설명하다 crontab(5):

crontab 파일은 위에서 아래로 구문 분석되므로 모든 환경 설정은 파일에서 그 아래에 있는 cron 명령에만 영향을 미칩니다.

이 문장은 데비안에서 추가한 것 같지만, 제가 사용해본 CentOS 시스템에서도 같은 효과를 발휘하는 것 같습니다. 그러나 Toby Speight가 자신의 의견에서 지적했듯이 환경 변수 할당은 crontabPOSIX 기능이 전혀 아니므로 YMMV입니다.


따라서 cron에 관계없이 다음을 수행할 수 있어야 합니다.

* * * * * /path/to/somescript.py maybe 
* * * * * /path/to/otherscript.pl some
* * * * * /path/to/thirdscript.sh args

스크립트에 올바른 hashbang 줄이 있는 경우(예 #!/usr/bin/python3: #!/usr/bin/perl#!/bin/bash) 등을 명령으로 전달할 수 있는 것으로 SHELL설정하고 인수를 사용하여 스크립트를 실행하면 됩니다 . /path/to/somescript.py maybe대부분의 셸은 사소한 항목을 동일하게 지원하므로 복잡한 항목을 별도의 스크립트에 넣고 행을 crontab단순하게 유지하면 스크립트 자체에서 모든 셸이나 스크립팅 언어를 사용할 수 있습니다.


직접 crontab 명령에서 다른 쉘을 사용해야 하는 경우 적어도 Vixie cron에서는 이를 수행할 수 있습니다.

SHELL=/bin/bash
* * 8-14 * * if test "$(date +\%w)" = 0; then echo $BASH_VERSION > /tmp/bashtest; fi
SHELL=/usr/bin/fish
* * 8-14 * * if test (date +\%w) = 0; echo $FISH_VERSION > /tmp/fishtest; end

둘 다 날짜가 일요일인지 확인하고 그렇다면 Bash를 사용하는 쉘 버전과 Fish를 사용하는 쉘 버전을 인쇄합니다. (물론 이것은 단지 예일 뿐이지만 cron 시간 설정이 작동하는 방식으로 인해 매월 첫 번째/두 번째/마지막 특정 근무일에 실행되는 것은 crontab에서 쉘 코드를 사용하려는 일반적인 상황 중 하나입니다. 주문하다.)

또한, 댓글에서 Nu는 여러 줄 명령을 지원하지 않으며 \거기에서 Bash를 사용할 수 있기를 바랐다고 언급하셨습니다. crontab 줄에 여러 줄의 명령을 사용할 수 없습니다. 명령 자체는 파일에서 한 줄에 있어야 하며 crontab 기호를 개행 문자로 cron사용 하는 경우 %첫 번째 줄 다음 줄이 명령으로 전송됩니다. . (이것이 위의 %형식 문자열에서 사용한 것을 이스케이프해야 하는 이유입니다 date.)

관련 정보