
次の簡単なシェル スクリプトをご覧ください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 スクリプトの最後に sleep を追加して確認しました)。
つまり、次のようなことが起こります: 画面が作成されます。ただし、bash スクリプトが終了すると、画面も終了します。つまり、画面は依然としてスクリプトに依存します。
スクリプトが終了したときに画面が終了しないようにするにはどうすればよいですか?
答え1
代わりにこのようなことを試しましたか?
#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py
このパラメータの組み合わせは、マニュアルページに従って、セッションが存在する場合はセッションに再接続しようとし、存在しない場合はセッションを作成します。
また、screen を呼び出すときに発生するエラーを除いて、ファイルにリダイレクトされる出力はないと思います。
答え2
実際、ここで screen を使用するのはあまり意味がないようです。しかし、私のボックスであなたの解決策をチェックしたところ、問題なく動作しました。screen セッションは 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"
そして私の問題は解決しました。