최근에 나는 점차적으로 쉘을 다음으로 전환하기 시작했습니다.화난 이 때문에 cron에서 SHELL에 경로를 할당하는 것을 고려했습니다.
대부분의 매뉴얼을 읽은 후 man 5 crontab
PATH를 보고 :
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
셸이 사용하는 항목만 제어합니다 . .cron
crontab
SHELL
crontab
데비안 매뉴얼 페이지설명하다 crontab(5)
:
crontab 파일은 위에서 아래로 구문 분석되므로 모든 환경 설정은 파일에서 그 아래에 있는 cron 명령에만 영향을 미칩니다.
이 문장은 데비안에서 추가한 것 같지만, 제가 사용해본 CentOS 시스템에서도 같은 효과를 발휘하는 것 같습니다. 그러나 Toby Speight가 자신의 의견에서 지적했듯이 환경 변수 할당은 crontab
POSIX 기능이 전혀 아니므로 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
.)