Чем systemctl enable отличается от systemctl start?

Чем systemctl enable отличается от systemctl start?

Я использую Arch Linux (последнюю, актуальную) и пытаюсь запустить MySQL при загрузке. С установленным пакетом systemd у меня есть systemctl, и поэтому я могу делать такие вещи:

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

Это все хорошо и отлично работает, когда я хочу запустить/остановить систему вручную, однако, когда дело доходит до запуска при загрузке (используя 'enable' в 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

У кого-нибудь есть идеи, почему «включить» не работает?

решение1

mysqld.serviceэто "виртуальная" единица – она не существует в файловой системе, это просто часть слоя совместимости systemd. Вы можете запустить ее, и systemd запустит устаревший /etc/rc.d/mysqldinitscript, но вы не можете 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=многопользовательский.целевой

Запустить systemctl daemon-reloadпосле создания/изменения.


В качестве альтернативы вы можете установить initscripts-systemdпакет, который включает в себя arch-daemons.targetавтоматический запуск служб, определенных в rc.conf. Однако этот пакет может скоро исчезнуть, и всегда лучше иметь собственные файлы конфигурации для используемой системы инициализации.

решение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/, а НЕ /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

Связанный контент