Отключение systemctl отличается от запуска systemctl, чем?

16

Я использую 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 выдает следующее:

[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

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

Руди Виссер
источник

Ответы:

19

mysqld.serviceэто «виртуальный» модуль - он не существует в файловой системе, это всего лишь часть уровня совместимости systemd. Вы можете запустить его, и systemd запустит устаревший /etc/rc.d/mysqldinitscript, но вы не сможете этого systemctl enableсделать, потому что вам нужен реальный .serviceфайл, который может быть помещен в нужное место.

Вы можете написать такой блок самостоятельно и вставить его в /etc/systemd/system/mysqld.service:

[Единица измерения]
Описание = MySQL Server
После того, как = 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 = multi-user.target

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


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

user1686
источник
Благодарность! Я на самом деле написал свой собственный mysqld.service, который очень похож на вчерашний день, но проходит через /etc/rc.d/mysqld start / stop для ExecStart / ExecStop. Принято, опубликует мою версию также в случае, если кто-то еще найдет ее Спасибо
Руди Виссер
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/и НЕ /lib/systemd/system/.

Последний предназначен для дистрибутивов; первый предназначен для конкретных вещей, которые вы настраиваете сами. Это как /usr/bin/против /usr/local/bin/соответственно.

Поэтому, если пакет не устанавливает файлы модулей самостоятельно (под /lib/systemd/system/), поместите свои собственные "пользовательские" вещи в /etc/systemd/system/.

акварель
источник
1
Это на самом деле не отвечает на его вопрос. Это больше похоже на комментарий к ответу @ Rudi.
PhilT
0

Разрешить - активировать "юнит", также известный как сервис aka daemon, при запуске 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

john_a_s
источник
0

Если у вас есть ... при включении вашего сервисного модуля, скопируйте его в / etc / systemd / system

Failed to issue method call: No such file or directory

Чтобы включить ваш сервисный модуль, добавьте ниже ..., чтобы вы могли включить систему mysqld.service (его включение в пространстве имен каждого пользователя)

[Install]
WantedBy=multi-user.target

Ура, сугатанг итлог

Sugatang Itlog
источник