Pregunta ¿Cómo iniciar una sesión de pantalla desde un script de shell usando crontab y luego volver a conectarlo?


Quiero ejecutar el siguiente script de shell (launch.sh) para iniciar / detener una sesión de pantalla con 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

Si lo ejecuto manualmente a través de un terminal de bash

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

Funciona como se esperaba

cat /home/fernando/screen/launch.log

Salida (después de ejecutarse dos veces)

--- 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 ---

En este caso, puedo volver a conectar a mi sesión de pantalla normalmente a través de un terminal de bash

screen -r

Me gustaría hacer lo mismo, pero ejecutar el script de shell anterior a través de crontab

Entonces, agregué la siguiente línea al crontab de mi usuario

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

Después de la hora programada, traté de volver a conectarme como antes a través de un terminal de bash

screen -r

Esta vez, obtuve la respuesta

There is no screen to be resumed. 

Comprobando mi archivo de registro encontré esta salida extraña (después de ejecutarse dos veces por 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 ---

También busqué syslog

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)

¿Qué estoy haciendo mal?

PD: estoy ejecutando en Ubuntu 14.04 LTS y mi versión de pantalla es 4.01.00devel (GNU) 2-May-06

EDITAR:

El problema parece estar relacionado con la siguiente línea de mi script de shell

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

Si cambio el comando ejecutado dentro de la sección de la pantalla de esta manera

screen -S tty-top -d -m top

¡Funciona!


3


origen


Usaste crontab -e como su usuario para agregar el trabajo de pantalla? Funcionó como esperaba para mí en Linux Mint. Cualquier mensaje de error en cron archivos de registro relacionados? La línea relevante en mi syslog: /var/log/syslog:May 10 10:35:01 fooHost CRON[3911]: (fooUser) CMD (/usr/bin/screen -d -m top) - waywardone
@waywardone Tienes razón. Funciona bien. Sin embargo, he descrito aquí una simplificación de mi problema original. En realidad, estoy ejecutando la pantalla de un script de shell. Cambiaré mi pregunta y agregaré más detalles. - Fernando Costa
¿Sería mejor publicar esta pregunta en Unix y Linux? - Fernando Costa


Respuestas:


Parece que tu problema es que $PID no está definido. Tanto los mensajes "Starting mitmproxy screen PID" como "Stopping mitperroxy screen PID" no tienen un PID definido. El error de kill no aparece la primera vez launch.sh se ejecuta desde cron porque el archivo PID no existe y la sección "Detener mitmproxy" no se ejecuta. La segunda vez, kill se llama con un indefinido $PID y de ahí el error.

¿Sabe cron dónde está tu screen y awk ¿son? ¿Necesita usar rutas absolutas en la sección donde determina el PID?


0



Cambié mi script para proporcionar la ubicación de ruta completa para ambos, pero los resultados siguen siendo los mismos. - Fernando Costa
Hice otra prueba también. Cuando cambio mitmproxy por la parte superior, por ejemplo, mi script se ejecuta como esperaba CRON. Por lo tanto, creo que mitmproxy no se está iniciando correctamente o se está bloqueando justo después de haberse iniciado. Esto explicaría por qué awk no puede encontrar su PID. - Fernando Costa
mitmproxy probablemente confíe en algo en su entorno que cron no tiene. - waywardone


Intente ajustar la llamada a la pantalla con la expectativa. Parece que la única diferencia entre ejecutar crontab y ejecutar terminal es que no tiene nada cuando se ejecuta desde crontab. esperar puede emular a pty.


0