如果作為 cronjob 運行,我的 shell 腳本不會啟動螢幕

如果作為 cronjob 運行,我的 shell 腳本不會啟動螢幕

請看一下下面的簡單 shell 腳本startCleanup.sh

#!/bin/sh
screen -d -m -S cleaner /usr/bin/python3 /opt/cleanup.py 

我的 crontab 看起來像這樣:

* * * * * /opt/startCleanup.sh > /opt/cleanup.log 2>&1

當我作為正常登入使用者在 shell 中執行此腳本時,我沒有任何問題。但是,如果我將其作為常規 cronjob 運行,則不會啟動任何螢幕。或者更好地說:螢幕已啟動(我認為),但是當腳本完成時,螢幕也與腳本一起終止。

有人知道如何解決這個問題嗎?

謝謝 :)

更新:好的,我現在肯定知道螢幕已正確執行(我透過在 bash 腳本末尾添加睡眠來檢查這一點)。

所以發生的事情是這樣的:螢幕被創建。但是當 bash 腳本完成時,螢幕也會終止。所以,畫面還是要看劇本。

如何避免腳本完成時螢幕終止?

答案1

你嘗試過這樣的事情嗎?

#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py

根據線上說明頁,此參數組合將嘗試重新附加到會話(如果存在),或建立(如果不存在)。

另外,我認為除了呼叫 screen 時發生的任何錯誤之外,不會有任何輸出重定向到該檔案。

答案2

確實,在這裡使用 screen 似乎沒有太大意義。但我已經在我的盒子上檢查了你的解決方案,效果很好。螢幕會話是從 cronjob 啟動的腳本啟動的,我可以附加到它。嘗試一些事情:

  1. 在 startCleanup.sh 腳本中新增螢幕的完整路徑
  2. 觀察 /var/log/cron 作業是否已啟動
  3. 將 /usr/bin/python3 /opt/cleanup.py 的輸出重定向到檔案並檢查透過 cron 啟動時是否運作正常

答案3

我面臨著像你一樣的類似問題,手動觸發 sh 檔案完全沒問題。但在 cronjob 中它不執行 screen 進程,這是我的 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"

我的問題解決了。

相關內容