Как запустить сеанс экрана из сценария оболочки с помощью crontab, а затем снова подключиться к нему?


3

Я хочу запустить следующий скрипт оболочки (launch.sh), чтобы запустить / остановить сеанс экрана с помощью crontab

!/bin/bash

cd ~/screen

DATE_FORMAT=+%Y-%m-%d:%H:%M:%S

echo --- START ---
date $DATE_FORMAT

if [ -f ./screen.pid ]
then
  PID="$(cat ./screen.pid)"
  echo Stopping mitmproxy screen PID=$PID
  kill $PID
  rm ./screen.pid
fi

echo Rotating log files
logrotate -s ./logrotate.status ./logrotate.config

#Starting proxy in reverse mode
screen -S tty-mitmproxy -d -m mitmproxy -p 3333 -R http://localhost:8000 -a ./mitmproxy.log

if [ $? -eq 0 ]
then
  PID="$(screen -ls | awk '/\.tty-mitmproxy\t/ {print strtonum($1)}')"
  echo Starting mitmproxy screen PID=$PID
  echo $PID > ./screen.pid
fi

date $DATE_FORMAT
echo --- END ---

exit 0

Если я запускаю его вручную через терминал Bash

/home/fernando/screen/launch.sh >> /home/fernando/screen/launch.log 2>&1

Работает как положено

cat /home/fernando/screen/launch.log

Выход (после выполнения дважды)

--- START ---
2016-05-10:22:50:32
Rotating log files
Starting mitmproxy screen PID=4897
2016-05-10:22:50:32
--- END ---
--- START ---
2016-05-10:22:50:34
Stopping mitmproxy screen PID=4897
Rotating log files
Starting mitmproxy screen PID=4919
2016-05-10:22:50:34
--- END ---

В этом случае я могу снова подключиться к сеансу экрана через терминал bash.

screen -r

Я хотел бы сделать то же самое, но выполнение вышеуказанного сценария оболочки через crontab

Итак, я добавил следующую строку в crontab моего пользователя

*/10 * * * * /home/fernando/screen/launch.sh >> /home/fernando/screen/launch.log 2>&1

После запланированного времени я попытался снова подключиться через терминал bash

screen -r

На этот раз я получил ответ

There is no screen to be resumed. 

Проверяя мой лог-файл, я обнаружил этот странный вывод (после выполнения crontab дважды)

--- START ---
2016-05-10:23:00:01
Rotating log files
Starting mitmproxy screen PID=
2016-05-10:23:00:02
--- END ---
--- START ---
2016-05-10:23:10:01
Stopping mitmproxy screen PID=
kill: uso: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... ou kill -l [sigspec]
Rotating log files
Starting mitmproxy screen PID=
2016-05-10:23:10:01
--- END ---

Я тоже искал системный журнал

grep "launch.sh" /var/log/syslog
May 10 23:00:01 fernando-PC CRON[4992]: (fernando) CMD (/home/fernando/screen/launch.sh >> /home/fernando/screen/launch.log 2>&1)
May 10 23:10:01 fernando-PC CRON[5045]: (fernando) CMD (/home/fernando/screen/launch.sh >> /home/fernando/screen/launch.log 2>&1)

Что я делаю неправильно?

PS: я работаю на Ubuntu 14.04 LTS и у меня версия экрана 4.01.00devel (GNU) 2-May-06

РЕДАКТИРОВАТЬ:

Кажется, проблема связана со следующей строкой моего сценария оболочки

screen -S tty-mitmproxy -d -m mitmproxy -p 3333 -R http://localhost:8000 -a ./mitmproxy.log

Если я изменю команду, выполненную в разделе экрана, таким образом

screen -S tty-top -d -m top

Оно работает!


Ты использовал crontab -e как вашему пользователю добавить экранную работу? Это работало, как и ожидалось для меня на Linux Mint. Любые сообщения об ошибках в cron связанные файлы журналов? Соответствующая строка в моем syslog: /var/log/syslog:May 10 10:35:01 fooHost CRON[3911]: (fooUser) CMD (/usr/bin/screen -d -m top)
waywardone

@waywardone Ты прав. Работает нормально. Тем не менее, я описал здесь упрощение моей первоначальной проблемы. На самом деле, я запускаю экран из сценария оболочки. Я изменю свой вопрос и добавлю больше деталей.
Fernando Costa

Было бы лучше отправить этот вопрос в Unix & amp; Linux?
Fernando Costa

Ответы:


0

Похоже, ваша проблема в том, что $PID не определено. Оба ваших сообщения «Запуск PID экрана mitmproxy» и «Остановка PID экрана mitmproxy» не имеют определенного PID. Ошибка от kill не появляется в первый раз launch.sh выполняется из cron, потому что PID-файл не существует, а раздел «Остановка mitmproxy» не выполняется. Второй раз, kill вызывается с неопределенным $PID и, следовательно, ошибка.

Cron знает где твой screen а также awk являются? Вам нужно использовать абсолютные пути в разделе, где вы определяете PID?


Я изменил свой сценарий, чтобы предоставить им полное местоположение, но результаты остались прежними.
Fernando Costa

Я сделал еще один тест тоже. Например, когда я меняю mitmproxy на top, мой скрипт выполняется так, как ожидал CRON. Поэтому я думаю, что mitmproxy не запускается правильно или падает сразу после запуска. Это объясняет, почему awk не может найти свой PID.
Fernando Costa

mitmproxy Скорее всего, в вашей среде есть что-то, чего нет у cron.
waywardone

0

Попробуйте перенести вызов на экран с ожидаемым. Похоже, единственная разница между запуском crontab и запуском терминала заключается в том, что у вас нет pty при запуске из crontab. ожидать можно подражать pty.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.