
다음의 간단한 쉘 스크립트를 살펴보십시오 startCleanup.sh
.
#!/bin/sh
screen -d -m -S cleaner /usr/bin/python3 /opt/cleanup.py
내 crontab은 다음과 같습니다.
* * * * * /opt/startCleanup.sh > /opt/cleanup.log 2>&1
정상적으로 로그인한 사용자로 쉘에서 이 스크립트를 실행하면 아무런 문제가 없습니다. 그러나 이것을 일반 cronjob으로 실행하면 화면이 시작되지 않습니다. 또는 더 나은 표현은: 화면이 시작되었지만(제 생각에는) 스크립트가 완료되고 스크립트와 함께 화면도 종료됩니다.
누구든지 이 문제를 해결하는 방법을 알고 있습니까?
감사해요 :)
업데이트: 좋습니다. 이제 화면이 올바르게 실행되었음을 확실히 알 수 있습니다(bash 스크립트 끝에 절전 모드를 추가하여 확인했습니다).
그러면 다음과 같은 일이 발생합니다. 화면이 생성됩니다. 그러나 bash 스크립트가 완료되면 화면도 종료됩니다. 따라서 화면은 여전히 스크립트에 따라 달라집니다.
스크립트가 완료될 때 화면이 종료되는 것을 어떻게 방지할 수 있나요?
답변1
대신 이런 걸 시도해 봤어?
#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py
맨페이지에 따르면 이 매개변수 조합은 존재하는 경우 세션에 다시 연결을 시도하고, 존재하지 않는 경우 생성을 시도합니다.
또한 screen을 호출할 때 발생하는 오류 외에는 파일로 리디렉션되는 출력이 없을 것이라고 생각합니다.
답변2
실제로 여기서 화면을 사용하는 것은 별 의미가 없는 것 같습니다. 하지만 내 상자에서 귀하의 솔루션을 확인했는데 제대로 작동합니다. 스크린 세션은 cronjob에서 시작된 스크립트에서 시작되며 여기에 연결할 수 있습니다. 몇 가지를 시도해 보세요:
- startCleanup.sh 스크립트에서 화면에 전체 경로를 추가하세요.
- 작업이 시작되면 /var/log/cron을 확인하세요.
- /usr/bin/python3 /opt/cleanup.py의 출력을 파일로 리디렉션하고 cron을 통해 시작할 때 제대로 실행되는지 확인합니다.
답변3
나는 당신과 비슷한 문제에 직면하고 있습니다. sh 파일을 수동으로 실행하는 것은 완전히 괜찮습니다. 하지만 cronjob에서는 화면 프로세스를 실행하지 않습니다. 이것은 sh 파일의 원래 코드입니다.
#!/bin/bash
bash -c "python GetCookie.py"
wait
export DISPLAY=:0
Respond=`screen -ls`
if [[ $Respond != *"UploadImage"* ]]; then
screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"
else
echo "NOPEEEE"
fi
cronjob 로그에는 작업이 트리거되었음을 표시했습니다. 하지만화면 -ls진행 중인 프로세스는 표시되지 않습니다.
내가 한 일은 변화였다
screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"
에게
screen -d -m -S myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"
내 문제가 해결되었습니다.