
Пожалуйста, взгляните на следующий простой скрипт оболочки startCleanup.sh
:
#!/bin/sh
screen -d -m -S cleaner /usr/bin/python3 /opt/cleanup.py
Мой crontab выглядит так:
* * * * * /opt/startCleanup.sh > /opt/cleanup.log 2>&1
Когда я запускаю этот скрипт в оболочке как обычный вошедший в систему пользователь, у меня нет никаких проблем. Однако, если я запускаю это как обычное задание cron, экран не запускается. Или лучше сказать: экран запускается (я думаю), но когда скрипт завершается, и вместе со скриптом экран также завершается.
Есть ли у кого-нибудь идеи, как решить эту проблему?
Спасибо :)
ОБНОВЛЕНИЕ: Хорошо, теперь я точно знаю, что экран выполняется правильно (я проверил это, добавив sleep в конец скрипта bash).
Итак, вот что происходит: экран создается. НО когда скрипт 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 он не выполняет процесс 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"
и моя проблема решена.