Как запустить программу Linux при запуске с помощью systemd

Стилизованное окно терминала на ноутбуке.

Фатмавати Ахмад Дзэнури / Shutterstock



Необходимо запустить программу Linux при загрузке? Программное обеспечение systemd позволяет делать это на любом Дистрибутив Linux с systemd - а их сейчас большинство, включая Ubuntu. Мы проведем вас через процесс создания интегрированной службы и даже поговорим с журналом.

В этом руководстве показано, как настроить системную службу, которая запускается при запуске системы. Чтобы запустить графическую программу при входе в систему, используйте вместо этого диспетчер автозагрузки на рабочем столе .





Запуск программ при запуске

Иногда программное обеспечение, которое вы устанавливаете на свой компьютер, подключается к процессу запуска Linux, поэтому программа автоматически запускается при каждом запуске компьютера. Вы можете легко добиться того же поведения с вашими собственными программами и сценариями или, фактически, с любой другой программой, установленной на вашем компьютере.

Программы, запускаемые при запуске, управляются systemd, система и сервис управляющий делами. systemd - это первый процесс, запускаемый при запуске. Это всегда было идентификатор процесса (PID) 1. Любой другой процесс, запущенный на вашем компьютере, запускается systemd или процессом, который systemd уже началось.



Программы, работающие в фоновом режиме, называются демоны или услуги. Буква d в ​​конце systemd означает демон. В этой статье мы создадим пример сервиса. Чтобы отметить все флажки, наш сервис должен быть:

  • Интегрирован с systemd через файл служебной единицы
  • Запускается при запуске
  • Управляется с помощью systemctl, интерфейс управления для systemd
  • Может писать в журнал

Создание сервисной программы

Нам нужна программа, которая systemd запустит. Мы создадим простой скрипт под названием htg.sh. В этом руководстве используется текстовый редактор Gedit, но вы можете использовать любой текстовый редактор, который вам нравится.

gedit echo



Реклама

systemd-cat редактор откроется. Скопируйте и вставьте следующий текст в редактор.

-p

Сохраните изменения и закройте редактор.

скрипт htg.sh в редакторе gedit

Сценарий не делает многого, но есть несколько моментов, на которые стоит обратить внимание.

  • Два while строки проходят через TIMESTAMP, программу, которая принимает вывод из программы и отправляет его в журнал . Записи в журнале имеют приоритет. Мы используем /usr/local/bin (приоритет) вариант, чтобы указать, что наши сообщения предназначены только для информации (информации). Это не важные ошибки или предупреждения.
  • Идет бесконечное systemd петля.
  • systemd переменная установлена ​​на текущую дату и время. Он форматируется в сообщение и отправляется в журнал.
  • Затем сценарий «спит» на 60 секунд.
  • Через 60 секунд цикл повторяется. Итак, этот сценарий записывает сообщение с отметкой времени в журнал один раз в минуту.

Скопируем скрипт в gedit каталог.

systemd

И нам нужно сделать его исполняемым:

ExecStart

Создание файла служебной единицы

Каждая программа, запускаемая systemd имеет файл определения, называемый файлом служебной единицы. Он содержит определенные атрибуты, которые systemctl можно использовать для поиска и запуска программы, а также для определения ее поведения.

Нам нужно создать файл модуля для нашей новой службы, но разумно убедиться, что ни один из существующих файлов модулей не имеет того имени, которое мы хотим дать нашей новой службе.

systemd

Вы можете прокрутить список файлов модулей, отсортированный по алфавиту, и убедиться, что имя, которое вы хотите использовать, не занято.

Реклама

Наш сервис будет называться htg.service. Ни у одного файла модуля нет такого имени, поэтому мы можем продолжить и создать наш файл модуля.

SIGTERM

systemctl редактор откроется. Скопируйте и вставьте в редактор следующий текст:

systemd

Сохраните изменения и закройте редактор.

файл модуля htg.service в редакторе gedit

Записи имеют следующие значения. Это типичные записи. Нашему простому сервису на самом деле не нужно большинство из них, но их включение позволяет нам их объяснить.

    Описание:Это текстовое описание вашей услуги. Хочет:Наш сервис хочет, но не требует, чтобы сеть была в рабочем состоянии до того, как наша служба будет запущена. После:Список имен модулей, которые следует запустить после успешного запуска этой службы, если они еще не запущены. Тип:Простой. systemctl будет считать, что эта служба запущена, как только процесс, указанный в start был разветвлен. ExecStart:Путь к процессу, который следует запустить. Начать сначала:Когда и нужно ли перезапускать службу. Мы установили его на отказ. RestartSec:Как долго ждать перед попыткой перезапуска службы. Это значение в секундах. KillMode:Определяет, как sleep должен убить процесс, если мы спросим sleep чтобы остановить службу. У нас есть этот набор для обработки. Это вызывает systemd использовать
    touch htg.sh
    сигнал только об основном процессе. Если бы наш сервис был нетривиальной программой, а не простым скриптом, мы бы установили его на смешанный, чтобы гарантировать, что все порожденные процессы также будут завершены. РазыскиваетсяУ нас установлено значение multi-user.target, что означает, что службу следует запускать, пока система находится в состоянии, когда несколько пользователей могут войти в систему, независимо от того, доступен ли графический интерфейс пользователя.

Файл модуля не обязательно должен быть исполняемым, но права доступа к файлу модуля должны ограничивать круг лиц, которые могут его редактировать. Вы же не хотите, чтобы злонамеренный или озорной пользователь изменил файл модуля так, чтобы он запускал совершенно другую программу.

Эта команда предоставит владельцу разрешения на чтение и запись, а также права на чтение для группы. У других не будет разрешений.

gedit htg.sh

Мы можем иметь

#!/bin/bash echo 'htg.service: ## Starting ##' | systemd-cat -p info while : do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo 'htg.service: timestamp ${TIMESTAMP}' | systemd-cat -p info sleep 60 done
проверьте синтаксис нашего файла модуля, даже если служба еще не запущена. О любых ошибках будет сообщено. (На самом деле, часть .service не является обязательной для большинства команд.)

sudo cp htg.sh /usr/local/bin

Реклама

Ошибки не выделяются, что означает, что наш файл модуля синтаксически корректен.

Запуск службы

Когда вы добавляете новый файл модуля или редактируете существующий, вы должны указать

sudo chmod +x /usr/local/bin/htg.sh
для перезагрузки определений файлов модулей.

sudo systemctl list-unit-files --type-service

Если вы хотите, чтобы служба запускалась при запуске, вы должны включить Это:

sudo gedit /etc/systemd/system/htg.service

Включение службы не запускает ее, а только устанавливает ее запуск во время загрузки. Для запуска службы в настоящее время , вы должны использовать

[Unit] Description=How-To Geek Service Example Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
с
sudo chmod 640 /etc/systemd/system/htg.service
вариант.

systemctl status htg.service

Проверка службы

После запуска службы вручную или после перезагрузки компьютера мы можем убедиться, что наша служба работает правильно.

sudo systemctl daemon-reload

Нам отображается статус услуги.

Статус htg.service в окне терминала

  • Зеленая точка означает, что наш сервис работает нормально.
  • Имя службы - htg.service, а подробное описание - это то, что мы предоставили в файле модуля.
  • Нам показано, какой файл модуля был загружен /etc/systemd/system/htg.service.
  • Сервис активен, и нам указано время запуска сервиса.
  • Его PID - 7762.
  • С сервисом связаны две задачи.
  • Всего 928 кибибайты памяти используются службой.
  • Группа управления включает скрипт htg.sh и
    sudo systemctl enable htg
    команда, запущенная htg.sh. В большинстве случаев
    sudo systemctl start htg
    Команда будет выполнять работу для этой службы.

Нам также показываются последние 10 записей журнала, созданных этой службой. Неудивительно, что все они разделены на одну минуту.

Остановка и отключение службы

Если вам нужно остановить службу, вы можете сделать это с помощью этой команды:

sudo systemctl status htg.service

Реклама

Это останавливает службу, но не препятствует ее перезагрузке при следующей перезагрузке компьютера. Чтобы служба не запускалась при запуске, необходимо запрещать Это:

sudo systemctl stop htg.service

Если служба запущена, эта команда не останавливает ее. Он просто сообщает

sudo systemctl disable htg.service
не запускать сервис при следующей перезагрузке.

Если вы хотите остановить службу и предотвратить ее запуск при запуске, используйте обе команды.

Совет по обслуживанию

Убедитесь, что ваша программа работает должным образом, прежде чем пытаться запустить ее как службу.

Команды Linux
Файлы деготь · pv · Кот · такс · chmod · рукоятка · разница · sed · С участием · человек · толкать · popd · fsck · тестовый диск · seq · fd · пандок · компакт диск · $ ПУТЬ · awk · присоединиться · jq · складывать · уникальный · journalctl · хвостик · государство · ls · fstab · выбросил · меньше · chgrp · Chown · rev · Посмотрите · струны · тип · переименовать · застегивать · распаковать · устанавливать · размонтировать · установить · fdisk · mkfs · rm · rmdir · rsync · df · gpg · мы · нано · mkdir · от · пер · пластырь · конвертировать · rclone · крошить · SRM
Процессы псевдоним · экран · верхняя · Ницца · Ренис · прогресс · Strace · система · tmux · чш · история · в · партия · бесплатно · который · dmesg · usermod · пс · chroot · xargs · tty · мизинец · lsof · vmstat · тайм-аут · стена · да · убийство · спать · судо · его · время · groupadd · usermod · группы · lshw · неисправность · перезагружать · останавливаться · выключение · пароль · lscpu · crontab · Дата · bg · фг
Сети netstat · пинг · трассировка · ip · SS · кто · fail2ban · бмон · ты · Палец · nmap · ftp · завиток · wget · ВОЗ · кто я · В · iptables · ssh-keygen · ufw

СВЯЗАННЫЙ: Лучшие ноутбуки с Linux для разработчиков и энтузиастов

ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ Фотография профиля Дэйва Маккея Дэйв Маккей
Дэйв Маккей впервые использовал компьютеры, когда в моде была перфолента, и с тех пор он занимается программированием. Проработав более 30 лет в ИТ-индустрии, он теперь работает журналистом в области информационных технологий. За свою карьеру он работал программистом-фрилансером, менеджером международной группы разработчиков программного обеспечения, менеджером проекта ИТ-услуг, а в последнее время - специалистом по защите данных. Его статьи были опубликованы на сайтах howtogeek.com, cloudsavvyit.com, itenterpriser.com и opensource.com. Дэйв - евангелист Linux и сторонник открытого исходного кода.
Прочитать полную биографию

Интересные статьи