crontab을 사용하여 스크립트에서 nohup을 호출하세요.

crontab을 사용하여 스크립트에서 nohup을 호출하세요.

crontab을 사용하여 장기 실행 스크립트를 확인하고 다시 실행하려고 합니다. 상태를 확인하고 필요한 경우 장기 실행 스크립트를 실행하는 스크립트를 만들었습니다.

로그아웃 시에도 계속 실행되도록 장기 실행 스크립트를 실행하기 위해 nohup을 사용하고 있습니다.

연결 유지 스크립트:

#!/bin/bash

BASE_PATH=~/scripts
LOG_PATH=${BASE_PATH}/keep_alive.log

write_to_log () {
    date >> ${LOG_PATH}
    echo ${1} >> ${LOG_PATH}
    echo "--------------" >> ${LOG_PATH}
}

pid=$(pgrep long_script)
 if [ -z "${pid}" ]; then
    write_to_log "long_script is no runnig, starting..."
    nohup ${BASE_PATH}/long_script.py &
fi

크론탭 항목:

*/30 * * * * /home/user/scripts/keep_alive.sh

스크립트를 수동으로 실행하면(bash, ./keep-alive.sh) 모든 것이 잘 작동하고 긴 스크립트가 시작됩니다.

crontab에서 스크립트가 즉시 시작되고 종료되며(경로/표현식에 문제 없음) 로그가 기록되는 것을 볼 수 있지만 긴 스크립트가 멈춥니다. 그래서 내 결론은 nohup이 bash와 crontab에서 다르게 작동한다는 것입니다.

나는 setid 또는 disown을 사용하는 데 지쳤지만 동일한 결과를 얻습니다.

어떻게 해결할 수 있나요? 감사해요.

답변1

nohup사용에는 필요하지 않습니다 crontab. systemd로그아웃 시 모든 프로세스를 종료하도록 구성 하지 않는 한 , crontab셸 종료와 실행 중인 프로세스(또는 기타) 사이에는 상호 작용이 없으며 nohup유용한 효과도 없습니다.

로컬 이메일( mail또는 mailx)을 확인하고 거기에 보고된 오류 메시지를 읽어 보십시오 cron. 또는 less /var/mail/$USER바로가기를 원하는 경우에도 마찬가지입니다. 아니면 crontab캡처로 라인을 변경하세요표준 출력그리고표준 에러나중에 볼 수 있는 파일로

*/30 * * * * /home/user/scripts/keep_alive.sh >ka.log 2>&1

cron환경 설정(등)을 잊어버렸기 때문에 다음 환경에서 스크립트가 실행되지 않는 경우가 많습니다 $PATH.

관련 정보