请看一下以下简单的 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 脚本末尾添加 sleep 来检查这一点)。
因此,会发生以下情况:屏幕已创建。但是,当 bash 脚本完成时,屏幕也会终止。因此,屏幕仍然依赖于脚本。
如何避免脚本执行完毕后屏幕终止?
答案1
您是否尝试过类似的方法?
#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py
根据手册页,如果存在,则此参数组合将尝试重新连接到会话;如果不存在,则创建会话。
此外,除了调用屏幕时发生的任何错误外,我认为不会有任何输出重定向到该文件。
答案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"
我的问题解决了。