Wie unterscheidet sich „systemctl enable“ von „systemctl start“?

Wie unterscheidet sich „systemctl enable“ von „systemctl start“?

Ich verwende eine Arch Linux-Box (aktuellste, aktuellste Version) und versuche, MySQL beim Booten zu starten. Wenn das systemd-Paket installiert ist, steht mir systemctl zur Verfügung und ich kann folgende Dinge tun:

systemctl start mysqld.service
systemctl [stop|status|restart] mysqld.service

Das ist alles in Ordnung und funktioniert gut, wenn ich es manuell starten/stoppen möchte. Wenn ich es jedoch beim Booten starten lassen möchte (indem ich „enable“ auf systemctl verwende, erhalte ich eine unangenehme Ausgabe):

[root@rudivarch ~]# systemctl enable mysqld.service
Failed to issue method call: No such file or directory

Da die anderen Befehle einwandfrei funktionieren, verwirrt mich das offensichtlich ernsthaft und ich habe eine ganze Weile versucht, es herauszufinden ... systemctl status gibt Folgendes aus:

[root@rudivarch ~]# systemctl status mysqld.service
mysqld.service
     Loaded: loaded (/etc/rc.d/mysqld)
     Active: inactive (dead) since Tue, 31 Jan 2012 15:32:28 +0000; 1min 25s ago
    Process: 589 ExecStop=/etc/rc.d/mysqld stop (code=exited, status=0/SUCCESS)
    Process: 257 ExecStart=/etc/rc.d/mysqld start (code=exited, status=0/SUCCESS)
    CGroup: name=systemd:/system/mysqld.service

Hat jemand eine Idee, warum „Aktivieren“ nicht funktioniert?

Antwort1

mysqld.serviceist eine „virtuelle“ Einheit – sie existiert nicht im Dateisystem, sondern ist nur Teil der Kompatibilitätsschicht von systemd. Sie können sie starten und systemd führt das alte /etc/rc.d/mysqldInitscript aus, aber Sie können systemctl enablees nicht, weil Sie eine echte Datei benötigen .service, die an der richtigen Stelle symbolisch verknüpft werden könnte.

Sie können eine solche Einheit selbst schreiben und in Folgendes einfügen /etc/systemd/system/mysqld.service:

[Einheit]
Beschreibung=MySQL Server
Nach=Netzwerk.Ziel

[Service]
ExecStart=/usr/bin/mysqld --defaults-file=/etc/mysql/my.cnf --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock
Benutzer=mysql
Gruppe=mysql
Arbeitsverzeichnis=/usr

[Installieren]
WantedBy=Mehrbenutzer.Ziel

systemctl daemon-reloadNach dem Erstellen/Ändern ausführen .


Alternativ können Sie das initscripts-systemdPaket installieren, das arch-daemons.targetden automatischen Start der in definierten Dienste beinhaltet rc.conf. Dieses Paket wird jedoch möglicherweise bald nicht mehr verfügbar sein und es ist immer besser, native Konfigurationsdateien für das verwendete Init-System zu haben.

Antwort2

Die Antwort von @Grawity ist richtig und wahrscheinlich besser als diese, aber ich habe es gestern im Wesentlichen gelöst, indem ich zum rc.d-Skript übergegangen bin …

/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/mysqld start
ExecStop=/etc/rc.d/mysqld stop

[Install]
WantedBy=multi-user.target

Antwort3

Nota bene: Denken Sie daran, hostspezifische Unit-Dateien unter /etc/systemd/system/und NICHT unterzubringen /lib/systemd/system/.

Letzteres ist für distributionsspezifische Dinge; Ersteres ist für hostspezifische Dinge, die Sie selbst konfigurieren. Es ist wie /usr/bin/vs. /usr/local/bin/bzw. .

Sofern ein Paket also keine Unit-Dateien selbst (unter /lib/systemd/system/) installiert, platzieren Sie Ihre eigenen „benutzerdefinierten“ Sachen unter /etc/systemd/system/.

Antwort4

Als ich auf meinem FC15-System „systemctl enable mysqld.service“ ausführte, kam automatisch folgendes zurück:

mysqld.service ist kein nativer Dienst und leitet zu /sbin/chkconfig weiter. Ausführen von /sbin/chkconfig mysqld auf

Versuchen Sie also Folgendes auszuführen: /sbin/chkconfig mysqld on

verwandte Informationen