Erstelle einen Daemon unter Ubuntu 16.04


13

Ich habe in PHP einen Crawler entwickelt, der eine URL mit bestimmten Headern analysiert und alle URLs des Inhalts in die Warteschlange stellt. Es funktioniert gut.

Ich habe diesen Code in einem Ubuntu 14.04 entwickelt und im Ordner / etc / init eine .conf-Datei mit folgendem Inhalt abgelegt:

# 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

Es funktioniert gut in Ubuntu 14.04 und ich kann den Daemon mit "sudo service crawler start" und "sudo service crawler stop" starten und stoppen

Jetzt in der Produktionsumgebung habe ich einen Ubuntu 16.04-Server und den gleichen Code im gleichen Ordner, aber wenn ich versuche, den Dienst zu starten, erhalte ich die Meldung "crawler.service konnte nicht gestartet werden. Unit crawler.service nicht gefunden".

Können Sie mir helfen?

Grüße


Fehlende ausführbare PHP-Datei in / usr / bin / php? Überprüfen Sie die Protokolle, Sie haben einige Informationen
Dom

2
Ubuntu 16.04 verwendet systemd. Finden Sie heraus, wie das funktioniert, und machen Sie einen crawler.service.
Halfgaar

Antworten:


15

Wenn Sie zu @Juanjo Aguilella Marés hinzufügen und Ihr Skript kopiert / verlinkt haben /etc/systemd/system, möchten Sie es möglicherweise automatisch starten, wenn der Server gestartet wird:

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

Quelle Digital Ocean

Es ist auch eine gute Idee, es nicht als root auszuführen. Ändern Sie einfach die userZeile in Ihrem Skript:

[Service]
User=some_user

12

Ich habe das Problem gelöst:

a) Erstellen Sie eine Datei crawler.service in / etc / systemd / system mit folgendem 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

Meine Bash-Datei enthält verschiedene Ausführungen parallel zur gleichen PHP-Datei mit diesem 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
}

Der Ruhezustand zwischen den Ausführungen ist erforderlich, um das Problem bei der Ausführung des Dienstes so schnell wie möglich zu beheben.

Wenn Sie Vorschläge zur Lösung haben, kommentieren Sie bitte, ich habe nicht viel Erfahrung mit Bash-Dateien und Systemd-Dateien, aber im Moment funktioniert es einwandfrei.



4

1]. Um einen Dienst zu erstellen, gehen Sie zu / etc / systemd / system /

2]. Erstellen Sie eine Datei mit dem Namen serviceName, z. B. chatSocket.service

3]. Legen Sie den Inhalt wie unten angegeben ab

[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]. Konfiguration neu laden durch Drücken von:

sudo systemctl daemon-reload

5]. Dienst standardmäßig aktivieren, damit beim Systemstart der Dienst automatisch gestartet wird:

sudo systemctl enable my_service.service

6]. Starten Sie Ihren Dienst mit dem folgenden Befehl:

sudo systemctl start my_service.service

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.