Crear demonio en ubuntu 16.04

13

Desarrollé un rastreador en PHP que analiza una URL con encabezados específicos y coloca todas las URL de contenido en la cola. Funciona bien.

Desarrollé este código en ubuntu 14.04 y puse un archivo .conf en la carpeta / etc / init con este contenido:

# Info
description "Warm the varnish to get the list of products"
author      "Juanjo Aguilella"

# Events
start on startup
stop on shutdown

# Automatically respawn
respawn
respawn limit 100 5

# Run the script
# Note, in this example, if your PHP script return
# the string "ERROR", the daemon will stop itself.
script
    [ $(exec /usr/bin/php -f /var/www/crawler.php) = 'ERROR' ] && ( stop; exit 1; )  
end script

Funciona bien en Ubuntu 14.04 y puedo iniciar y detener el demonio usando "sudo service crawler start" y "sudo service crawler stop"

Ahora, en el entorno de producción, tengo un servidor Ubuntu 16.04 y pongo el mismo código en la misma carpeta, pero cuando intento iniciar el servicio recibo el mensaje "No se pudo iniciar crawler.service. Unidad crawler.service no encontrada"

¿Me pueden ayudar?

Saludos

Juanjo Aguilella Marés
fuente
Falta el ejecutable de php en / usr / bin / php? Verifique los registros, tendrá algo de información
Dom
2
Ubuntu 16.04 usa systemd. Descubra cómo funciona eso y cree un servicio de rastreo.
Halfgaar

Respuestas:

15

Agregando a @Juanjo Aguilella Marés la respuesta, y una vez que haya copiado / vinculado su script /etc/systemd/system, es posible que desee iniciarlo automáticamente cuando se inicie el servidor:

sudo systemctl daemon-reload
sudo systemctl enable my_service.service
sudo systemctl start my_service.service

Fuente Digital Ocean

También es una buena idea no ejecutarlo como root. Simplemente cambie la userlínea en su script:

[Service]
User=some_user
Andres
fuente
12

Resolví el problema:

a) Cree un archivo crawler.service en / etc / systemd / system con este código:

[Unit]
Description=Crawler cache Service
After=network.target

[Service]
User=root
Restart=always
Type=forking
ExecStart=/var/www/execute.sh

[Install]
WantedBy=multi-user.target

mi archivo bash contiene diferentes ejecuciones en paralelo al mismo archivo php con este código:

#!/bin/sh
php /var/www/tiendas.local.mediamarkt.es/crawler.php
sleep 0.1
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.2
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.3
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.4
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}

La suspensión entre ejecuciones es necesaria para salvar el problema de la ejecución tan rápida del servicio.

Si tiene alguna sugerencia sobre la solución, por favor comente, no tengo mucha experiencia en archivos bash y archivos systemd, pero por el momento funciona bien.

Juanjo Aguilella Marés
fuente
4

1] Para crear un servicio, vaya a / etc / systemd / system /

2] Cree un archivo de serviceName, por ejemplo, chatSocket.service

3] Ponga contenido para archivar como se indica a continuación

[Unit]
Description=Your PHP Daemon Service
#Requires=mysqld.service memcached.service #May your script needs mysql or other services to run.
#After=mysqld.service memcached.service

[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/server.pid
ExecStart=/usr/bin/php -f /home/shrikant/workspace/app/Http/Controllers/server.php  2>&1> /dev/null #path to script
#ExecStop=/bin/kill -HUP $MAINPID
#ExecReload=/bin/kill -HUP $MAINPID
KillMode=process

Restart=on-failure
RestartSec=42s

StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all php output to this one.
StandardError=/home/shrikant/workspace/app/Http/Controllers/chatSocket.log #path to error log file
[Install]
WantedBy=default.target

4]. Vuelva a cargar la configuración presionando:

sudo systemctl daemon-reload

5] Habilite el servicio de manera predeterminada, de modo que cuando el servicio de inicio del sistema se inicie automáticamente:

sudo systemctl enable my_service.service

6] Comience su servicio usando el siguiente comando:

sudo systemctl start my_service.service

Shree29
fuente