Me pregunto si alguien podría indicarme la dirección correcta. Tengo poca experiencia trabajando con la línea de comandos de Linux y, recientemente, debido a varios factores en el trabajo, se me ha pedido que adquiera conocimientos.
Básicamente tengo dos php
scripts que residen en un directorio en mi servidor. Para los fines de la aplicación, estos scripts deben ejecutarse continuamente. Actualmente lo implemento de esta manera:
nohup sh -c 'while true; do php get_tweets.php; done' >/dev/null &
y
nohup sh -c 'while true; do php parse_tweets.php; done' >/dev/null &
Sin embargo, he notado que, a pesar del ciclo infinito, los scripts se detienen periódicamente y me veo obligado a reiniciarlos. No estoy seguro de por qué, pero lo hacen. Eso me ha hecho considerar la posibilidad de un CRON
trabajo que comprueba si se están ejecutando y si no lo están, ejecútelos/reinícielos.
¿Alguien podría proporcionarme información sobre cómo hacer esto?
Respuesta aceptada:
Me gustaría ampliar la respuesta de Davidann ya que eres nuevo en el concepto de un trabajo cron. Cada sistema UNIX o Linux tiene un crontab almacenado en alguna parte. El crontab es un archivo de texto sin formato. Considere lo siguiente:(De Gentoo Wiki en Cron)
#Mins Hours Days Months Day of the week
10 3 1 1 * /bin/echo "I don't really like cron"
30 16 * 1,2 * /bin/echo "I like cron a little"
* * * 1-12/2 * /bin/echo "I really like cron"
Este crontab debe hacer eco de "Realmente me gusta cron" cada minuto de cada
hora de cada día cada dos meses. Obviamente, solo harías eso
si realmente te gustara cron. El crontab también repetirá "Me gusta cron un poco
" a las 16:30 todos los días en enero y febrero. También hará eco
"Realmente no me gusta cron" a las 3:10 el 1 de enero.
Siendo nuevo en cron, probablemente quiera comentar las columnas destacadas para saber para qué se usa cada columna. Todas las implementaciones de Cron que conozco siempre han sido de este orden. Ahora fusionando la respuesta de Davidann con mi archivo comentado:
#Mins Hours Days Months Day of week
* * * * * lockfile -r 0 /tmp/the.lock && php parse_tweets.php; rm -f /tmp/the.lock
* * * * * lockfile -r 0 /tmp/the.lock &&php get_tweets.php; rm -f /tmp/el.bloqueo
Si no se pone ningún valor en cada columna, el valor predeterminado es:
Cada minuto de cada hora de cada día de cada mes durante toda la semana, –> Cada minuto durante todo el año.
Como afirma Davidann, el uso de un archivo de bloqueo garantiza que solo se ejecute una copia del intérprete de php, php parse_tweets.php
es el comando para "ejecutar" el archivo, y el último bit de la línea eliminará el archivo de bloqueo para estar listo para la próxima ejecución. No me gusta eliminar un archivo cada minuto, pero si este es el comportamiento que necesita, es muy aceptable. Escribir y reescribir en el disco es solo una preferencia personal