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

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

2 ответа2

0

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .