다음과 같은 스크립트가 있습니다.
#!/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