Если запустить мой скрипт оболочки как cronjob, он не выведет экран на экран.

Если запустить мой скрипт оболочки как cronjob, он не выведет экран на экран.

Пожалуйста, взгляните на следующий простой скрипт оболочки 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, и я могу к нему прикрепиться. Попробуйте несколько вещей:

  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"

и моя проблема решена.

Связанный контент