
Я использую 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/mysqld
initscript, но вы не можете 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