Die Aktivierung von systemctl unterscheidet sich vom Start von systemctl. Wie?

16

Ich verwende eine Arch Linux-Box (die aktuellste) und versuche, MySQL dazu zu bringen, beim Booten zu starten. Mit dem installierten systemd-Paket habe ich systemctl zur Verfügung, und als solches kann ich Folgendes tun:

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

Das ist alles in Ordnung und funktioniert sehr gut, wenn ich manuell starten / stoppen möchte, aber wenn es darum geht, es beim Booten zu starten (wenn ich 'enable' auf systemctl benutze, bekomme ich eine schlechte Ausgabe):

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

Da die anderen Befehle natürlich einwandfrei funktionieren, bin ich ernsthaft verwirrt und habe einige Zeit damit verbracht, 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?

Rudi Visser
quelle

Antworten:

19

mysqld.serviceist eine "virtuelle" Einheit - sie existiert nicht im Dateisystem, sondern ist nur Teil der Kompatibilitätsebene von systemd. Sie können es starten und systemd wird das /etc/rc.d/mysqldalte Initscript ausführen, aber Sie können es nicht systemctl enable, weil Sie eine echte .serviceDatei benötigen, die an der richtigen Stelle verlinkt werden könnte.

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

[Einheit]
Beschreibung = MySQL Server
After = network.target

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

[Installieren]
WantedBy = multi-user.target

Führen systemctl daemon-reloadnach dem Erstellen / Ändern.


Alternativ können Sie das initscripts-systemdPaket installieren , das das arch-daemons.targetautomatische Starten von in definierten Diensten beinhaltet rc.conf. Dieses Paket könnte jedoch bald verschwinden, und es ist immer besser, native Konfigurationsdateien für das verwendete Init-System zu haben.

user1686
quelle
Vielen Dank! Eigentlich habe ich meinen eigenen mysqld.service geschrieben, der dem von gestern sehr ähnlich ist, aber für ExecStart / ExecStop an /etc/rc.d/mysqld start / stop übergeben wird. Akzeptiert, postet meine Version auch für den Fall, dass jemand anderes sie findet! Danke
Rudi Visser
3

@ Grawitys Antwort ist richtig und wahrscheinlich besser als diese, aber ich habe sie gestern gelöst, indem ich sie an das rc.d-Skript weitergeleitet habe ...

/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
Rudi Visser
quelle
2

Hinweis: Denken Sie daran, hostspezifische Gerätedateien unter /etc/systemd/system/und NICHT zu setzen /lib/systemd/system/.

Letzteres ist für distro-spezifische Sachen gedacht; Ersteres gilt für hostspezifische Dinge, die Sie selbst konfigurieren. Es ist wie /usr/bin/gegenüber /usr/local/bin/sind.

Also, es sei denn, ein Paket installiert Unit-Dateien von selbst (unter /lib/systemd/system/), legen Sie Ihre eigenen "benutzerdefinierten" Sachen unter /etc/systemd/system/.

Aquarelle
quelle
1
Dies beantwortet seine Frage nicht wirklich. Dies sieht eher aus wie ein Kommentar zu @ Rudis Antwort.
PhilT
0

Aktivieren ist das Aktivieren von "unit" aka daemon aka service beim Start von systemd.

OpenSUSE:

# systemctl list-units --all | grep sql
mysql.service             loaded inactive dead          LSB: Start the MySQL database 
(good)

# systemctl enable mysql.service
mysql.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysql on
insserv: Service localfs has to exists for service vmware-USBArbitrator
insserv: Service network is missed in the runlevels 2 to use service vmware
Warning: unit files do not carry install information. No operation executed.

(it actually redirects to old chkconfig/sysvinit and that corrects init databases)

# systemctl start mysql.service

(no output)

# systemctl status mysql.service
mysql.service - LSB: Start the MySQL database server
          Loaded: loaded (/etc/init.d/mysql)
          Active: active (running) since Tue, 31 Jan 2012 20:07:52 +0100; 5s ago
         Process: 999999 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
          CGroup: name=systemd:/system/mysql.service
                  ├ 999999 /bin/sh /usr/bin/mysqld_safe --mysqld=mysqld --user=mysql...
                  └ 999999 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql...

(sort of runs)
ZaB
quelle
Ja, ich verstehe das und mysqld ist ein Daemon / Dienst, den ich beim Start ausführen möchte. Dies ist mein Punkt, es startet / stoppt, wird aber nicht "aktiviert".
Rudi Visser
0

Wenn ich auf meinem FC15-System "systemctl enable mysqld.service" ausführte, kam es automatisch zurück mit:

mysqld.service ist kein nativer Dienst, der nach / sbin / chkconfig umleitet. Führen Sie / sbin / chkconfig mysqld am aus

Also lauf mal: /sbin/chkconfig mysqld on

john_a_s
quelle
0

Wenn Sie ... beim Aktivieren Ihrer Service Unit haben, kopieren Sie diese nach / etc / systemd / system

Failed to issue method call: No such file or directory

Um Ihre Service Unit zu aktivieren, fügen Sie unter ... Folgendes hinzu, damit Sie mysqld.service (dessen Aktivierung in jedem Namespace eines Benutzers) vom System aktivieren können.

[Install]
WantedBy=multi-user.target

Prost, sugatang itlog

sugatang itlog
quelle