Warum kann meine systemd-Einheit beim Neustart des Servers nicht ausgeführt werden?

7

Ich habe Probleme damit, dass eine systemd Service Unit-Datei beim Neustart des Servers ordnungsgemäß ausgeführt wird. Dieser Server ist eine Neuinstallation von CentOS 7.0.1406. Ich versuche, es mit mehreren Apache-httpd-Instanzen einzurichten. Bei einer älteren CentOS-Installation funktionierten die httpd-Instanzen einwandfrei, und jetzt versuche ich, diese Konfigurationen auf das neue CentOS zu portieren, das systemd verwendet.

Ich kann den Dienst aktivieren, starten, neu starten und ohne Probleme beenden. Wenn ich einen Neustart durchführe, wird "Keine solche Datei oder kein solches Verzeichnis" angezeigt. Wenn ich den Dienst wieder aktiviere, funktioniert alles bis zum nächsten Neustart wieder.



Servicedatei:

[Unit]
Description=Apache web server instance apache01
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/data/apacheinstances/apache01/logs/httpd.pid
ExecStart=/data/apacheinstances/apache01/bin/apachectl start
ExecStop=/data/apacheinstances/apache01/bin/apachectl stop
ExecReload=/data/apacheinstances/apache01/bin/apachectl reload
PrivateTmp=true
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target



Wie ich es aktiviert habe:

$ sudo systemctl enable /data/apacheinstances/apache01/bin/apache01.service
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/apache01.service'


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: inactive (dead)



Wie ich angefangen habe:

$ sudo systemctl start apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:37:56 PDT; 13s ago
  Process: 1740 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1746 (httpd)
   CGroup: /system.slice/apache01.service
           +-1746 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1747 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1748 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1749 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1750 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1751 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:37:56 server105 apachectl[1740]: Starting apache01: [  OK  ]
Oct 08 14:37:56 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:37:56 server105 systemd[1]: Started Apache web server instance apache01.



Wie ich es neu gestartet habe:

$ sudo systemctl restart apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:38:40 PDT; 12s ago
  Process: 1836 ExecStop=/data/apacheinstances/apache01/bin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 1844 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1850 (httpd)
   CGroup: /system.slice/apache01.service
           +-1850 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1851 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1852 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1853 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1855 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1856 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:38:40 server105 apachectl[1844]: Starting apache01: [  OK  ]
Oct 08 14:38:40 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:38:40 server105 systemd[1]: Started Apache web server instance apache01.



Wie ich es gestoppt habe:

$ sudo systemctl stop apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: inactive (dead) since Wed 2014-10-08 14:39:44 PDT; 12s ago
  Process: 1940 ExecStop=/data/apacheinstances/apache01/bin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 1844 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1850 (code=exited, status=0/SUCCESS)

Oct 08 14:38:40 server105 apachectl[1844]: Starting apache01: [  OK  ]
Oct 08 14:38:40 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:38:40 server105 systemd[1]: Started Apache web server instance apache01.
Oct 08 14:39:44 server105 systemd[1]: Stopping Apache web server instance apache01...
Oct 08 14:39:44 server105 apachectl[1940]: Stopping apache01: [  OK  ]
Oct 08 14:39:44 server105 systemd[1]: Stopped Apache web server instance apache01.



Status nach Neustart:

$ sudo systemctl status apache01
apache01.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

Oct 08 14:44:58 server105 systemd[1]: Cannot add dependency job for unit apache01.service, ignoring: Unit apache01.service failed to load: No such file or directory.



Wie ich es wieder aktiviere und starte:

$ sudo systemctl reenable /data/apacheinstances/apache01/bin/apache01.service
rm '/etc/systemd/system/apache01.service'
rm '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/apache01.service'


$ sudo systemctl start apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:52:20 PDT; 5s ago
  Process: 1737 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1743 (httpd)
   CGroup: /system.slice/apache01.service
           +-1743 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1744 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1745 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1746 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1747 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1748 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:52:20 server105 apachectl[1737]: Starting apache01: [  OK  ]
Oct 08 14:52:20 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:52:20 server105 systemd[1]: Started Apache web server instance apache01.

Ich bin nicht sicher, warum es vor einem Neustart ohne Probleme funktioniert, aber danach scheitern. Wenn ich die erneute Aktivierung nicht durchführe, wird weiterhin der gleiche Fehler bezüglich "Keine solche Datei oder kein solches Verzeichnis" angezeigt.

Ich habe versucht, die Protokollierungsfunktionen in systemd zu untersuchen, um festzustellen, welche Datei oder welches Verzeichnis nicht gefunden werden kann, habe jedoch ein Leerzeichen gezeichnet.

Hat jemand anderes diese Art von Verhalten schon einmal erlebt?

Richard Morris
quelle
1
Versuchen Sie, den Dienst auf zu verschieben, /etc/systemd/system/und prüfen Sie, ob das Problem weiterhin besteht.
Cyrias
@kyrias das hat funktioniert. Eine Sache, die ich vergessen habe zu erwähnen, war, dass / data auf einem anderen Laufwerk gemountet ist. Ich dachte, mit "After = remote-fs.target" würde sichergestellt, dass das Laufwerk / data vor dem Start des Dienstes bereitgestellt wurde (vorausgesetzt, dies ist der Grund für "Keine solche Datei oder kein solches Verzeichnis"). Müssen sich die Gerätedateien im Verzeichnis / etc / systemd / system befinden? Wenn nicht, würde ich es immer noch vorziehen, wenn die Dateien mit den restlichen httpd-Instanzkonfigurationen übereinstimmen, um die Sicherung und Dokumentation ein wenig zu vereinfachen.
Richard Morris
systemdmuss die .serviceDatei lesen, um zu analysieren After=remote-fs.target. systemdStartet früh im Startvorgang und liest alle .serviceDateien (oder Symlinks zu diesen Dateien). Zu diesem Zeitpunkt befindet sich Ihre .serviceDatei in einem nicht gemounteten Remote-Dateisystem und systemdbeschwert sich daher , dass sie nicht gefunden werden kann, wenn versucht wird, dem Symlink zu folgen /etc/systemd. Es hat noch nicht einmal die AfterAussage getroffen. Das Fazit ist, dass sich alle .serviceDateien auf einem Dateisystem befinden müssen, auf das sehr früh im Startvorgang zugegriffen werden kann.
garethTheRed

Antworten:

9

Alle Dienste müssen vor dem Start geladen und analysiert werden, und Ihr Dienst ist zu Beginn des Startvorgangs nicht verfügbar, wenn systemd alle Dienste analysiert, da er sich auf einer anderen Partition befindet.

Um dies zu lösen, behalten Sie entweder die lokalen Dienste bei /etc/systemd/system/oder erstellen Sie ein Paket für Ihre Distribution und platzieren Sie sie in/usr/lib/systemd/system/

kyrias
quelle
Oh Gott, das war auch mein Problem, habe es nach vielen Stunden endlich verstanden
Peedee