systemctl enable 與 systemctl start 不同,有何不同?

systemctl enable 與 systemctl start 不同,有何不同?

我正在運行 Arch Linux(最新的)機器,並嘗試讓 MySQL 在啟動時啟動。安裝了 systemd 軟體包後,我就可以使用 systemctl 了,因此我可以執行以下操作:

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

這一切都很好,當我想手動啟動/停止時效果很好,但是,當它在啟動時啟動時(通過在 systemctl 上使用“enable”,我會得到一些令人討厭的輸出):

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

顯然,由於其他命令工作得很好,我對此感到非常困惑,並且花了很長時間試圖弄清楚...... systemctl status 輸出如下:

[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

有人知道為什麼「啟用」不起作用嗎?

答案1

mysqld.service是一個「虛擬」單元-它不存在於檔案系統上,它只是 systemd 相容層的一部分。您可以啟動它,systemd 將運行舊的/etc/rc.d/mysqldinit 腳本,但您不能systemctl enable啟動它,因為您需要一個.service可以符號連結到正確位置的真實檔案。

你可以自己寫一個這樣的單元並將其放入/etc/systemd/system/mysqld.service

[單元]
描述=MySQL 伺服器
之後=網路.目標

[服務]
ExecStart=/usr/bin/mysqld --defaults-file=/etc/mysql/my.cnf --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock
用戶=mysql
群組=mysql
工作目錄=/usr

[安裝]
WantedBy=多用戶.target

systemctl daemon-reload創建/修改後運行。


或者,您可以安裝該initscripts-systemd軟體包,其中包括arch-daemons.target用於自動啟動rc.conf.然而,這個套件可能很快就會消失,並且最好為正在使用的 init 系統提供本機設定檔。

答案2

@Grawity 的答案是正確的,可能比這更好,但我昨天基本上通過傳遞到 rc.d 腳本解決了這個問題...

/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

答案3

注意:請記得將特定於主機的單元檔案放在/etc/systemd/system/和 NOT下/lib/systemd/system/

後者用於特定發行版的內容;前者用於您自己配置的特定於主機的內容。分別類似於/usr/bin/vs /usr/local/bin/

因此,除非套件自行安裝單元檔案(在 下/lib/systemd/system/),否則請將您自己的「自訂」內容放在 下/etc/systemd/system/

答案4

在我的 FC15 系統上,當我執行“systemctl enable mysqld.service”時,它會自動返回:

mysqld.service 不是本機服務,重新導向到 /sbin/chkconfig。執行 /sbin/chkconfig mysqld

所以嘗試運行: /sbin/chkconfig mysqld on

相關內容