Hola, tengo un bot de telegram con python que se inicia automáticamente con raspbian, quiero hacer un script para que compruebe si el proceso del bot está ejecutándose y en caso contrario lo ejecute, por si se para por alguna razón, antes con "pgrep nombre_script" me indicaba el pid y así sabia si se estaba ejecutando, pero de buenas a primeras pgrep no me da el pid, de echo no hace nada...
Alguna idea? muchas gracias!
pgrep no muestra un proceso de python
- wat3r
- Pi Omega
- Mensajes: 97
- Registrado: 16 Ago 2016, 06:49
- Agradecido: 0
- Agradecimiento recibido: 1 vez
Por que estas llamando al código no al programa. Si pones python te sale el PID del programa .py ejecutado por python.
prep python mismo PID que hacer ps aux | grep bot.py
Enviado desde mi SM-G900F mediante Tapatalk
prep python mismo PID que hacer ps aux | grep bot.py
Enviado desde mi SM-G900F mediante Tapatalk
- rbcheca
- Pi Alpha
- Mensajes: 18
- Registrado: 10 Sep 2016, 20:11
- Agradecido: 0
- Agradecimiento recibido: 0
Ummm... no entiendo nada.
Antes tenia un script python que es el siguiente:
comando = 'pgrep casabot.py'
tuberia = os.popen(comando)
salida_estandar = tuberia.readlines()
print salida_estandar
tuberia.close()
if re.match(".*\d.*", str(salida_estandar)):
pass
else:
pb.push_note("AVISO", "Se ha detenido el bot")
Hacía un pgrep a nombre del script me daba el pid del proceso y si el pid contenia un numero es que el bot se estaba ejecutando, y si estaba vacío me mandaba un pushbullet diciendo que el bot se ha detenido.
Si hago pgrep python me da los pid de todos los scripts python que se están ejecutando, y si detengo el script, al hacer pgrep python me sigue dando el pid aunque el script no este en ejecución...
No entiendo nada...
De todas formas si conocéis otra forma de saber si un script se esta ejecutando, bienvenida sea XDD
Gracias!!
Antes tenia un script python que es el siguiente:
comando = 'pgrep casabot.py'
tuberia = os.popen(comando)
salida_estandar = tuberia.readlines()
print salida_estandar
tuberia.close()
if re.match(".*\d.*", str(salida_estandar)):
pass
else:
pb.push_note("AVISO", "Se ha detenido el bot")
Hacía un pgrep a nombre del script me daba el pid del proceso y si el pid contenia un numero es que el bot se estaba ejecutando, y si estaba vacío me mandaba un pushbullet diciendo que el bot se ha detenido.
Si hago pgrep python me da los pid de todos los scripts python que se están ejecutando, y si detengo el script, al hacer pgrep python me sigue dando el pid aunque el script no este en ejecución...
No entiendo nada...
De todas formas si conocéis otra forma de saber si un script se esta ejecutando, bienvenida sea XDD
Gracias!!
- wat3r
- Pi Omega
- Mensajes: 97
- Registrado: 16 Ago 2016, 06:49
- Agradecido: 0
- Agradecimiento recibido: 1 vez
Pues nada que python es un lenguaje de programación el cual tiras de un código lo que sea.py y de un intérprete python.
Pues por much que lo intentes casabot.py no es un binario si no un código y linux no le asocia un PID. Linux le asocia un PID al intérprete que es python que lo ejecuta.
Así que pgrep casabot.py no muestra nada si mostrará pgrep python. Y mostrará un PID por cada código que tengas ejecutado en pithon.
No se si me explico
Enviado desde mi SM-G900F mediante Tapatalk
Pues por much que lo intentes casabot.py no es un binario si no un código y linux no le asocia un PID. Linux le asocia un PID al intérprete que es python que lo ejecuta.
Así que pgrep casabot.py no muestra nada si mostrará pgrep python. Y mostrará un PID por cada código que tengas ejecutado en pithon.
No se si me explico
Enviado desde mi SM-G900F mediante Tapatalk
- wat3r
- Pi Omega
- Mensajes: 97
- Registrado: 16 Ago 2016, 06:49
- Agradecido: 0
- Agradecimiento recibido: 1 vez
Mira @rbcheca te voy a echar un cable y te olvidas de pgrep y cosas así. Te voy a escribir un script bash shell, Este me lo he echo hoy por que yo tengo otro bot de telegram y el muy cabrito se cierra a la media hora.
En vez de buscar un PID ya que puedes tener varios programas ejecutandos con python en tu sistema lo vamos a buscar con el nombre del programa en cuestión.
Supongamos que nuestro bot programado en python está en /home/pi y se llama bot.py
Creamos un scrip con
En el escribimos
Lo guardamos con control+x, y le damos a yes.
Le damos permisos de ejecución al script con
Y añadimos el script para que lo compruebe que bot.py se ejecuta periódicamente. Para ello usamos CRON.
Mas info sobre CRON https://es.wikipedia.org/wiki/Cron_(Unix)
Para que ejecute el script cada 20 minutos escribimos
y añadimos al final del todo la linea
Y con estos pasos el scrip cada 20 minutos comprobara si bot.py está ejecutandose y si no lo está lo ejecutará.
Un saludo
PD: Recuerda que yo he usado como ejemplo los nombres del programa en python y su ubicación de una forma genérica, tu deberías modificar esto con los nombres y la hubicaciónes de los archivos que tu tengas
En vez de buscar un PID ya que puedes tener varios programas ejecutandos con python en tu sistema lo vamos a buscar con el nombre del programa en cuestión.
Supongamos que nuestro bot programado en python está en /home/pi y se llama bot.py
Creamos un scrip con
Código: Seleccionar todo
$nano controlbot.sh
Código: Seleccionar todo
#!/bin/sh
SERVICE='bot.py'
#Comprueba si el programa bot.py está ejecutandose
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE se esta ejecutando"
else
echo "El programa $SERVICE esta detenido, iniciando..."
python /scripts/telegram/bot.py &
fi
Le damos permisos de ejecución al script con
Código: Seleccionar todo
$chmod +x controlbot.sh
Mas info sobre CRON https://es.wikipedia.org/wiki/Cron_(Unix)
Para que ejecute el script cada 20 minutos escribimos
Código: Seleccionar todo
$crontab -e
Código: Seleccionar todo
*/20 * * * * bash /home/pi/controlbot.sh
Un saludo
PD: Recuerda que yo he usado como ejemplo los nombres del programa en python y su ubicación de una forma genérica, tu deberías modificar esto con los nombres y la hubicaciónes de los archivos que tu tengas