Запуск, остановка и перезапуск службы с помощью systemctl
На этом этапе вы научитесь управлять жизненным циклом системных служб с помощью команд systemctl. Вы попрактикуетесь в запуске, остановке и перезапуске службы. Для этого упражнения мы создадим фиктивную службу. Такой подход гарантирует, что мы сможем безопасно манипулировать службой, не затрагивая критически важные системные функции.
Сначала давайте создадим простой файл юнита службы. Этот файл будет определять службу, которая просто записывает временную метку в файл журнала каждые несколько секунд.
Создайте новый файл юнита службы с именем mytest.service непосредственно в каталоге системы systemd с помощью nano:
sudo nano /etc/systemd/system/mytest.service
Вставьте следующее содержимое в редактор nano:
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]: Содержит общую информацию о юните. Description предоставляет удобочитаемое имя, а After=network.target указывает, что эта служба должна запускаться после инициализации сети.
[Service]: Определяет поведение службы.
Type=simple: Указывает простой тип службы, где команда ExecStart является основным процессом.
ExecStart: Команда, выполняемая при запуске службы. Здесь это цикл bash, который записывает сообщение с временной меткой в /tmp/mytest.log каждые 5 секунд.
ExecStop: Команда, выполняемая при остановке службы. Она записывает сообщение об остановке в журнал.
Restart=on-failure: Настраивает службу на перезапуск, если она завершается с ненулевым статусом.
[Install]: Содержит информацию о том, как должна быть установлена служба. WantedBy=multi-user.target означает, что эта служба должна запускаться, когда система достигает уровня выполнения multi-user.
Сохраните файл, нажав Ctrl+X, затем Y для подтверждения и Enter для сохранения файла.
Теперь перезагрузите демон systemd, чтобы он распознал новый файл службы:
sudo systemctl daemon-reload
Запуск службы
Для запуска службы используйте команду systemctl start.
Выполните следующую команду, чтобы запустить mytest.service. Обратите внимание, что нам нужно использовать sudo, поскольку операции systemctl обычно требуют прав root.
sudo systemctl start mytest.service
Если команда выполнена успешно, немедленного вывода не будет.
Теперь проверьте, запущена ли служба, проверив ее состояние:
systemctl status mytest.service
Вы должны увидеть вывод, указывающий, что служба находится в состоянии active (running):
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Вы также можете проверить файл журнала, чтобы увидеть, записывает ли служба сообщения:
tail -f /tmp/mytest.log
Вы должны увидеть новые строки, появляющиеся каждые 5 секунд, примерно так:
Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.
Нажмите Ctrl+C, чтобы выйти из tail.
Остановка службы
Чтобы остановить запущенную службу, используйте команду systemctl stop.
Выполните следующую команду, чтобы остановить mytest.service:
sudo systemctl stop mytest.service
Опять же, немедленного вывода не будет.
Проверьте, что служба остановлена:
systemctl status mytest.service
Вывод теперь должен показывать Active: inactive (dead):
○ mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: inactive (dead) since ...
...output omitted...
Снова проверьте файл журнала /tmp/mytest.log. Вы должны увидеть сообщение "My Test Service stopped." и отсутствие новых сообщений "running".
tail /tmp/mytest.log
Вывод будет выглядеть примерно так:
Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Перезапуск службы
Чтобы перезапустить службу, используйте команду systemctl restart. Эта команда сначала останавливает службу, а затем снова запускает ее. Это полезно, когда вы внесли изменения в конфигурацию службы и вам нужно, чтобы они вступили в силу.
Выполните следующую команду, чтобы перезапустить mytest.service:
sudo systemctl restart mytest.service
Проверьте, что служба снова запущена:
systemctl status mytest.service
Вы снова должны увидеть Active: active (running), а Main PID, вероятно, будет новым числом, указывающим на запуск нового процесса.
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Проверьте файл журнала /tmp/mytest.log, чтобы убедиться, что служба возобновила запись сообщений "running".
tail -f /tmp/mytest.log
Вы должны увидеть сообщение "stopped", за которым следуют новые сообщения "running":
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.
Нажмите Ctrl+C, чтобы выйти из tail.