systemctl enable与systemctl start不同,怎么办?


16

我正在运行Arch Linux(最新的)计算机,并试图使MySQL在启动时启动。安装systemd软件包后,我可以使用systemctl,因此可以执行以下操作:

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

很好,当我想手动启动/停止时,效果很好,但是,要使其在启动时启动(通过在systemctl上使用“启用”,我会得到一些讨厌的输出):

[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

有人对为什么“启用”不起作用有任何想法吗?

Answers:


19

mysqld.service是一个“虚拟”单元–在文件系统上不存在,它只是systemd兼容性层的一部分。您可以启动它,并且systemd将运行旧式/etc/rc.d/mysqld初始化脚本,但是您不能这样systemctl enable做,因为您需要一个.service可以符号链接到正确位置的真实文件。

您可以自己编写一个这样的单元并将其放入/etc/systemd/system/mysqld.service

[单元]
Description = MySQL服务器
之后= network.target

[服务]
ExecStart = / usr / bin / mysqld --defaults-file = / etc / mysql / my.cnf --datadir = / var / lib / mysql --socket = / var / run / mysqld / mysqld.sock
用户= mysql
组= mysql
WorkingDirectory = / usr

[安装]
WantedBy =多用户目标

systemctl daemon-reload创建/修改后运行。


或者,您可以安装该initscripts-systemd软件包,其中包括arch-daemons.target用于自动启动中定义的服务的软件包rc.conf。但是,此软件包可能很快就会消失,因此最好使用正在使用的init系统的本机配置文件。


谢谢!我实际上写了我自己的mysqld.service,它与昨天的情况非常相似,但是通过ExecStart / ExecStop传递到/etc/rc.d/mysqld start / stop。接受,还将发布我的版本,以防其他人发现它!感谢
Rudi Visser'2

3

@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

2

注意:请记住将主机特定的单元文件放在/etc/systemd/system/和NOT下/lib/systemd/system/

后者用于发行特定的东西;前者用于您自己配置的主机特定内容。分别 类似于/usr/bin/vs。/usr/local/bin/

因此,除非软件包自行安装了单位文件(在之下/lib/systemd/system/),否则请在下放置您自己的“自定义”内容/etc/systemd/system/


1
这并不能真正回答他的问题。这看起来更像是对@Rudi答案的评论。
PhilT 2014年

0

启用是在启动时激活“单元” aka守护程序aka服务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)

是的,我理解这一点,并且mysqld是我希望在启动时运行的守护程序/服务。这是我的观点,它开始/停止,但是不会“启用”。
鲁迪·维瑟

0

在我的FC15系统上,当我运行'systemctl enable mysqld.service'时,它自动返回:

mysqld.service不是本机服务,重定向到/ sbin / chkconfig。在/ sbin / chkconfig mysqld上执行

因此,请尝试运行: /sbin/chkconfig mysqld on


0

如果在启用服务单元时有...,请将其复制到/ etc / systemd / system

Failed to issue method call: No such file or directory

要启用服务单元,请在...下面添加,以便您可以系统启用mysqld.service(在每个用户的名称空间中启用)

[Install]
WantedBy=multi-user.target

干杯,sugatang itlog

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.