업그레이드 후 cron 스크립트에서 /usr/sbin/ssmtp 명령을 찾을 수 없습니다.

업그레이드 후 cron 스크립트에서 /usr/sbin/ssmtp 명령을 찾을 수 없습니다.

동일한 cron 스크립트를 실행하는 여러 라즈베리 파이가 있지만 라즈베리 파이 중 하나를 업데이트/업그레이드한 후

ssmtp:: command not found

명령줄에서 명령을 실행할 수 있지만 명령줄에서 스크립트를 실행하면 실패하므로 실제로 cron 문제는 아닙니다.

전체 경로를 사용하고 있습니다./usr/sbin/ssmtp

명령줄에서 이 명령을 사용하면 정상적으로 실행됩니다.

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

이것은 스크립트 코드의 일부입니다.

#!/bin/bash
set -o pipefail

mysendmail="/usr/sbin/ssmtp"
$(echo -e "To: $tophil\nSubject: $(hostname) $ip2" | $mysendmail $tophil 2>&1)

답변1

질문자가 문제를 해결했다고 말했기 때문에 포기한 의견을 여기에 답변으로 바꾸었습니다.

이 코드는 나에게 두 가지 문제를 야기합니다. 나는 그것들을 고치는 것이 누락된 문제를 해결할 것이라고 생각하지 않지만 ssmtp분명히 그렇습니다.

  • $( ... )스크립트의 마지막 줄에서 래퍼를 제거합니다. 이는 셸이 래핑된 명령의 출력을 사용하도록 지시하고, 줄 설정 방법에 따라 이를 실행하려고 시도합니다. (명령이 출력을 생성하지 않으면 오류가 발생하지 않습니다.)

    echo hello
    hello
    
    $(echo hello)
    -bash: hello: command not found
    

    명령 결과를 문자열에 삽입하거나 변수에 할당하는 데 자주 사용됩니다.

    a=$(date)
    printf "Today's date is: %s\n" "$(date +%Y-%m-%d)"
    
  • 변수를 사용할 때마다 큰따옴표로 묶으십시오. 예를 들어,

    echo -e "To: $tophil\nSubject: $(hostname) $ip2" | "$mysendmail" "$tophil" 2>&1
    #                                                  ^           ^ ^       ^
    

    어떤 경우에는 큰따옴표로 묶인 변수가 꼭 필요한 것은 아니지만 이렇게 하면 잘못될 일이 없으므로 항상 큰따옴표로 묶는 것이 가장 쉽고 안전합니다.

관련 정보