Iloo

https://iloo.wordpress.com

CentOS: “daemonizar” scripts PHP

Un problema con el que estuve sufriendo peleando por un buen rato fue el de tener scripts PHP funcionando todo el tiempo.

El problema era que no se podía usar cronjobs, ya que los scripts funcionaban con gearman (del cual escribiré en otro post) y tenían que estar a la espera de ser invocados y realizar una determinada tarea, la cual tiene un tiempo variable y por tanto no se puede usar cron.

Las características debían ser de poder iniciar los scripts PHP y tenerlos como servicios o demonios, a demás de poder pararlos en cualquier momento, generalmente para hacer alguna modificación.

Después de buscar por un rato llegue con estas dos soluciones:

  1. Usar System_Daemon.
  2. Usar Supervisor.

Obviamente ninguna de las dos formas funciono, la verdad es que no pude instalar ninguno de ellos (por problemas de dependencias, alertas, etc). Entonces la solución sería hacer uno mismo el script, y aquí lo tenemos:

#!/bin/sh
# description: start php script

. /etc/rc.d/init.d/functions

pathworker=/home/user/public_html/script.php

start() {
        echo -n "Starting script"
        daemon php "$pathworker&"
}

stop() {
        echo -n "Stopping script"
        killproc php "$pathworker"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart}"
esac

Es claro que el script es bastante sencillo pero cumple con su función y eso es lo importante, supongamos que lo llamamos phpd, tiene que estar en /etc/init.d. Claro antes tiene que tener permisos de ejecución:

sudo chmod +x /etc/init.d/phpd

Para iniciar el demonio:

/etc/init.d/phpd start

Para pararlo:

/etc/init.d/phpd stop

Y eso sería prácticamente todo, ahora si se quiere daemonizar varios scripts PHP a la vez se puede modificar el script quedando de la siguiente manera:

#!/bin/sh
# description: start php script

. /etc/rc.d/init.d/functions

pathworker=/home/user/public_html/list

start() {
        echo -n "Starting script"
        daemon "$pathworker&"
}

stop() {
        echo -n "Stopping script"
        killproc php "$pathworker"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart}"
esac

Donde el archivo list contendría los scripts PHP que se desean daemonizar:

#!/bin/sh
php /home/user/public_html/script1.php &&
php /home/user/public_html/script2.php &&
php /home/user/public_html/script3.php;

Nota: al hacer esto hay un problema y es que no se pueden parar todos los demonios iniciados con el comando stop, si no que habría que hacerlo manualmente.

4 Respuestas a “CentOS: “daemonizar” scripts PHP

  1. Jonathan Coreas 03/08/2011 en 8:59 PM

    Hace poco descargue la ultima version de centos principalmente porque es un clon de red hat y este es muy usado en las empresas por eso creo que es importante aprender sobre esta distro ya que es igualito a rh

  2. Enrique 03/10/2011 en 5:33 AM

    he probado esto, pero en el momento que cierro la terminal del Putty el script tambien se para ¿que puedo hacer?

  3. Enrique 06/10/2011 en 6:16 AM

    Ya he descubierto el motivo. Tenía algún echo en el script, los cambie por un log y sin problemas.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s