내 crontab에는 다음 bash 기능이 설정되어 내 작업에 적용되었습니다. 로그에 타임스탬프를 추가함을 나타냅니다.
adddate() {
while IFS= read -r line; do
printf '%s %s\n' "$(date)" "$line";
done
}
30 06 * * * root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
error.txt
그런데 bash 기능이 제대로 작동하지 않는 걸 보니 .
/bin/bash: adddate: command not found
이 모든 것의 근본 원인은 무엇입니까?
누구든지 의견이 있으면 알려주시기 바랍니다.
감사해요
답변1
Cron은 쉘 기능을 허용하지 않습니다. 다음과 같은 스크립트를 작성하십시오.
#!/bin/bash
adddate() {
while IFS= read -r line; do
printf '%s %s\n' "$(date)" "$line";
done
}
$binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
그리고 cron에 넣어주세요.
$binPath
(이 문제를 해결하기 위해 및 here 를 사용하고 있다고 가정합니다 $logPath
. 그렇지 않은 경우 스크립트에서 설정해야 합니다.)
SHELL=/bin/bash
당신 의crontab
가능한쉘 함수를 사용하는 방법입니다.
(나는 그것을 시도하지 않았습니다. 그것이 작동한다면 놀랄 것입니다). 그러나 그것이 효과가 있다고 해도 나는 그것을 추천하지 않을 것입니다.
답변2
함수 대신 별칭을 사용할 수 있습니다.
홈 디렉터리에 .profile 또는 .bashrc 파일을 추가합니다.
alias adddate="while IFS= read -r line; do printf '%s %s\n' "$(date)" "$line"; done"
그런 다음 crontab에서:
30 06 * * * shopt -s expand_aliases; root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
일반적으로 crontab(즉, 비대화형 쉘)도 별칭을 허용하지 않지만 shopt -s expand_aliases
.