Я хочу запустить следующий скрипт оболочки (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)
Ответы:
Похоже, ваша проблема в том, что
$PID
не определено. Оба ваших сообщения «Запуск PID экрана mitmproxy» и «Остановка PID экрана mitmproxy» не имеют определенного PID. Ошибка отkill
не появляется в первый разlaunch.sh
выполняется из cron, потому что PID-файл не существует, а раздел «Остановка mitmproxy» не выполняется. Второй раз,kill
вызывается с неопределенным$PID
и, следовательно, ошибка.Cron знает где твой
screen
а такжеawk
являются? Вам нужно использовать абсолютные пути в разделе, где вы определяете PID?источник
mitmproxy
Скорее всего, в вашей среде есть что-то, чего нет у cron.Попробуйте перенести вызов на экран с ожидаемым. Похоже, единственная разница между запуском crontab и запуском терминала заключается в том, что у вас нет pty при запуске из crontab. ожидать можно подражать pty.
источник