스크립트는 일반적으로 작동하지만 cron에서는 작동하지 않습니다.

스크립트는 일반적으로 작동하지만 cron에서는 작동하지 않습니다.

다음과 같은 스크립트가 있습니다.

#!/bin/bash

D=~/brew\ update

num=$(ls "$D" | cut -d ' ' -f 2 | sort -nr | head -1)
num=$(( num + 1 ))

script -q "$D/brew_update $num" brew update

이 스크립트는 항상 작동하지만 cron으로 시작하면 0 */5 * * * ~/bin/brewupdate2파일에 다음과 같이 표시됩니다./var/mail

^Dscript: brew: No such file or directory

그래서 사용하는 줄 알았는데 sh, 사용해 보니 sh ~/bin/brewupdate2오류 없이 실행되었습니다.

답변1

 D=~/brew\ update
 # the above will never work unless you start script as you
 # say you are user fred, this full path will always work
 D=/home/fred/brew\ update

Cron은 사용자와 다른 권한과 경로를 사용합니다. 즉, cron은 기본적으로 자체 사용자(루트)이고 자체 PATH 등을 가지고 있습니다. ~/를 사용하지 마십시오. cron 작업이 시작될 때 귀하의 홈 디렉토리가 아닌 다른 홈 디렉토리를 참조합니다. ~/는 작업을 시작한 시스템의 사용자 홈 디렉토리(이 경우 루트)에 상대적입니다. "brew update"의 전체 경로를 사용하십시오(가능한 경우 디렉토리 이름과 디렉토리 이름이 사용자의 통제 하에 있는 경우 공백을 제거하십시오). 경로 생성 측면에서 cron이 ~/로 수행하는 작업이 무엇인지 모르겠습니다. 예상대로 작동하지 않기 때문에 그런 점을 고려한 적이 없습니다.

cron을 사용할 때는 항상 전체 시스템 경로를 사용하십시오. 그렇지 않으면 이러한 유형의 오류가 발생합니다.

~에서서버 장애:

[cron]은 어떤 사용자로 실행되나요?

그들은 모두 루트로 실행됩니다. 다른 방법이 필요한 경우 스크립트에서 su를 사용하거나 사용자의 crontab(man crontab) 또는 시스템 전체 crontab(CentOS에서는 위치를 알 수 없음)에 crontab 항목을 추가하세요.

따라서 이론적으로는 루트의 홈 디렉터리인 /root/로 변환되는 ~/를 사용할 수 있지만 이는 다시 가독성과 테스트 등에 있어서 매우 나쁜 아이디어입니다.

[업데이트] 위에서 언급했듯이 여기서 문제는 "brew"가 cron의 $PATH에 없는 /usr/local/bin에 있다는 것입니다. 이로 인해 "brew" 명령이 실패하고 파일을 찾을 수 없게 됩니다. 마지막 줄을 놓쳤어요. 그러나 항상 전체 경로를 사용해야 하는 이유가 더욱 많아졌습니다. 모든 프로그램과 파일에 대한 전체 경로는 이러한 모든 문제를 해결합니다.

답변2

@Lizardx의 답변에서 언급했듯이 PATH환경 변수는 사용자 계정의 환경 변수와 다를 수 있습니다. 표시되는 오류는 script명령을 찾을 수 없음 을 나타냅니다 brew.

brew: No such file or directory

오류를 수정하는 가장 쉬운 방법은 입력 명령에 대한 정확한 경로를 지정하는 것입니다 script.

script -q "$D/brew_update $num" /usr/local/bin/brew update

관련 정보