Créer un démon sur Ubuntu 16.04

13

J'ai développé un robot en PHP qui analyse une URL avec des en-têtes spécifiques et place toutes les URL de contenu dans la file d'attente. Ça fonctionne bien.

J'ai développé ce code dans un ubuntu 14.04 et j'ai mis un fichier .conf dans le dossier / etc / init avec ce contenu:

# 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

Cela fonctionne bien dans Ubuntu 14.04 et je peux démarrer et arrêter le démon en utilisant "sudo service crawler start" et "sudo service crawler stop"

Maintenant, dans l'environnement de production, j'ai un serveur Ubuntu 16.04 et je mets le même code dans le même dossier, mais lorsque j'essaie de démarrer le service, je reçois le message "Impossible de démarrer crawler.service. Unit crawler.service not found"

Pouvez-vous m'aider?

Cordialement

Juanjo Aguilella Marés
la source
Exécutable php manquant dans / usr / bin / php? Vérifiez les journaux, vous aurez quelques informations
Dom
2
Ubuntu 16.04 utilise systemd. Découvrez comment cela fonctionne et créez un crawler.service.
Halfgaar

Réponses:

15

En ajoutant à la réponse @Juanjo Aguilella Marés, et une fois que vous avez copié / lié votre script à /etc/systemd/system, vous voudrez peut-être le démarrer automatiquement au démarrage du serveur:

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

Source Digital Ocean

C'est aussi une bonne idée de ne pas l'exécuter en tant que root. Changez simplement la userligne de votre script:

[Service]
User=some_user
Andres
la source
12

J'ai résolu le problème:

a) Créez un fichier crawler.service dans / etc / systemd / system avec ce code:

[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

mon fichier bash contient plusieurs exécutions en parallèle au même fichier php avec ce code:

#!/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
}

le sommeil entre les exécutions est nécessaire pour sauver le problème de l'exécution si rapide du service.

Si vous avez des suggestions sur la solution, veuillez commenter, je n'ai pas beaucoup d'expérience dans les fichiers bash et les fichiers systemd, mais pour le moment ça marche bien.

Juanjo Aguilella Marés
la source
4

1]. Pour créer un service, allez dans / etc / systemd / system /

2]. Créez un fichier de serviceName, par exemple chatSocket.service

3]. Mettre le contenu dans un fichier comme indiqué ci-dessous

[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]. Recharger la configuration en appuyant sur:

sudo systemctl daemon-reload

5]. Activez le service par défaut pour que le démarrage du système démarre automatiquement:

sudo systemctl enable my_service.service

6]. Démarrez votre service en utilisant la commande ci-dessous:

sudo systemctl start my_service.service

Shree29
la source