如果作为 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 脚本末尾添加 sleep 来检查这一点)。

因此,会发生以下情况:屏幕已创建。但是,当 bash 脚本完成时,屏幕也会终止。因此,屏幕仍然依赖于脚本。

如何避免脚本执行完毕后屏幕终止?

答案1

您是否尝试过类似的方法?

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

根据手册页,如果存在,则此参数组合将尝试重新连接到会话;如果不存在,则创建会话。

此外,除了调用屏幕时发生的任何错误外,我认为不会有任何输出重定向到该文件。

答案2

确实,在这里使用屏幕似乎没有什么意义。但我在我的机器上检查了你的解决方案,它工作正常。屏幕会话是从 cronjob 启动的脚本启动的,我可以附加到它。尝试以下几件事:

  1. 在 startCleanup.sh 脚本中添加屏幕完整路径
  2. 查看 /var/log/cron 中是否有作业启动
  3. 将输出从 /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"

我的问题解决了。

相关内容