Запуск исполняемого файла как сервиса под Debian 8

1705
Dave

Вот детали версии машины Debian, которую я использую:

root@my-host-name:~# cat /etc/debian_version 8.9 root@my-host-name:~# uname -a Linux my-host-name 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux root@my-host-name:~# 

Чтобы выполнить свою работу, я захожу на эту машину как root и выполняю эту команду:

/usr/java/jre1.8.0_131/bin/java -jar /usr/local/jenkins/jenkins.war 

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

Я создал обычного непривилегированного пользователя "jenkins" для запуска этой учетной записи. Когда машина загрузится, я бы хотел, чтобы показанная выше команда автоматически запускалась от имени этого нового пользователя "jenkins". Точно так же, когда машина выключена, я бы хотел, чтобы этот процесс был завершен изящно.

Я предполагаю, что я хочу, чтобы это приложение работало как служба. (Пожалуйста, исправьте меня, если я не совсем правильно использую термин «обслуживание».)

Как я могу сделать это?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ, ДОБАВЛЕННАЯ ПОСЛЕ ПЕРВОГО ОТВЕТА НА ОТВЕТ

Похоже, у меня есть и systemd, и init .

root@my-host-name:~# ps -elf | grep system 4 S root 156 1 0 80 0 - 10379 - Jul31 ? 00:00:00 /lib/systemd/systemd-udevd 4 S root 157 1 0 80 0 - 7480 - Jul31 ? 00:00:00 /lib/systemd/systemd-journald 4 S root 420 1 0 80 0 - 7083 - Jul31 ? 00:00:00 /lib/systemd/systemd-logind 4 S message+ 422 1 0 80 0 - 10713 - Jul31 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation 4 S Debian-+ 812 1 0 80 0 - 8914 - Jul31 ? 00:00:00 /lib/systemd/systemd --user 4 S root 993 1 0 80 0 - 6809 - Aug01 ? 00:00:00 /lib/systemd/systemd --user 0 R root 5305 4936 0 80 0 - 3182 - 02:51 pts/0 00:00:00 grep system root@my-host-name:~# ps -elf | grep init 4 S root 1 0 0 80 0 - 44052 - Jul31 ? 00:00:01 /sbin/init 0 R root 5307 4936 0 80 0 - 3182 - 02:51 pts/0 00:00:00 grep init 

Будут ли они конфликтовать? Как они взаимодействуют?

Кроме того, мой каталог / etc / systemd / system представляет собой лабиринт каталогов и ссылок на каталоги:

root@my-host-name:/etc/systemd/system# ls -l total 48 drwxr-xr-x 2 root root 4096 Apr 13 03:45 bluetooth.target.wants lrwxrwxrwx 1 root root 37 Apr 13 03:45 dbus-org.bluez.service -> /lib/systemd/system/bluetooth.service lrwxrwxrwx 1 root root 40 Apr 13 03:44 dbus-org.freedesktop.Avahi.service -> /lib/systemd/system/avahi-daemon.service lrwxrwxrwx 1 root root 40 Apr 13 03:45 dbus-org.freedesktop.ModemManager1.service -> /lib/systemd/system/ModemManager.service lrwxrwxrwx 1 root root 53 Apr 13 03:45 dbus-org.freedesktop.nm-dispatcher.service -> /lib/systemd/system/NetworkManager-dispatcher.service lrwxrwxrwx 1 root root 32 Apr 13 03:45 display-manager.service -> /lib/systemd/system/gdm3.service drwxr-xr-x 2 root root 4096 Apr 13 03:37 getty.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:45 graphical.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:37 halt.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:45 hibernate.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:45 hybrid-sleep.target.wants drwxr-xr-x 2 root root 4096 Jul 13 09:21 multi-user.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:37 paths.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:37 poweroff.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:37 reboot.target.wants drwxr-xr-x 2 root root 4096 Apr 13 03:44 sockets.target.wants lrwxrwxrwx 1 root root 31 Apr 13 03:45 sshd.service -> /lib/systemd/system/ssh.service drwxr-xr-x 2 root root 4096 Apr 13 03:45 suspend.target.wants lrwxrwxrwx 1 root root 35 Apr 13 03:37 syslog.service -> /lib/systemd/system/rsyslog.service 

Означает ли это что-нибудь дополнительное о механизме запуска, который используется моей машиной Debian? Учитывая это содержимое каталога, все еще правильно помещать предложенный jenkins.service непосредственно в / etc / systemd / system, или я должен попытаться выяснить этот шаблон ссылок и попытаться воспроизвести его?

0
Похоже, ваша система запускает традиционную инициализацию SysV (pid 1). Вы должны создать скрипт инициализации, systemd также обратно совместим со скриптами инициализации sysv, подробности смотрите в моем ответе. sebasth 6 лет назад 0

1 ответ на вопрос

2
sebasth

Скорее всего, вы используете systemd в качестве системы inint. Чтобы настроить свой сервис, вам нужно создать необходимый файл модуля, например /etc/systemd/system/jenkins.service.

[Unit] Description=Jenkins After=network.target  [Service] Type=simple ExecStart=/usr/java/jre1.8.0_131/bin/java -jar /usr/local/jenkins/jenkins.war User=jenkins  [Install] WantedBy=multi-user.target 

Чтобы загрузить сервис для запуска при загрузке, запустите systemctl daemon-reload. systemctl start jenkins.serviceзапускает службу из командной строки. Для полной документации см. Справочные страницы . На домашней странице Systemd также есть много материала для дальнейшего изучения.

В случае, если вы используете SysV стиль инициализации, вам нужно написать сценарий инициализации, который начинает свой демон в /etc/init.d/, например /etc/init.d/jenkins(и пометить его исполняемым).

#!/bin/sh ### BEGIN INIT INFO # Provides: jenkins # Default-Start: 2 3 4 5 # Default-Stop: 1 ### END INIT INFO  EXEC="/usr/java/jre1.8.0_131/bin/java" ARGS="-jar /usr/local/jenkins/jenkins.war" USER="jenkins" PIDFILE="/run/jenkins.pid"  . /lib/lsb/init-functions  case "$1" in start) start-stop-daemon --start --background --chuid $USER \ --make-pidfile --pidfile $PIDFILE --exec $EXEC -- $ARGS ;; stop) start-stop-daemon --stop --pidfile $PIDFILE --exec $EXEC ;; *) echo "Usage: /etc/init.d/jenkins " exit 1 ;; esac  exit 0 

Обратите внимание, что вы должны разветвить свой сервис в вашем скрипте инициализации, иначе ваш скрипт не завершится, в этом примере start-stop-daemon  выполняет forking ( --background) и меняет user ( --chuid). Чтобы изучить, как другие сервисы запускаются в вашей системе с использованием скриптов инициализации, вы можете изучить файлы в /etc/init.d/.

Чтобы включить службу во время загрузки, запустите update-rc.d jenkins enable. Для запуска сервиса запустите ваш новый скрипт /etc/init.d/jenkins start.

Совместимые с LSB сценарии инициализации также совместимы с системой обратно. Не забудьте исходный код /lib/lsb/init-functionsдля systemctl для прозрачной работы при непосредственном выполнении сценария.

Вики Debian для LSBInitScripts содержит более подробную информацию о доступных опциях, таких как запуск службы после / до другой службы.

Спасибо! Я добавил дополнительную информацию в мой оригинальный пост о systemd против init. Указанная вами команда systemctl daemon-reload && systemctl start jenkins.service предназначена для запуска из командной строки, чтобы я мог запустить службу без перезагрузки? Или он предназначен для вставки в какой-либо сценарий запуска, чтобы служба * запускалась * после перезагрузки? Dave 6 лет назад 0
Отредактировал мой ответ, включив пример сценария инициализации sysv. `systemctl daemon-reload` загружает новый файл модуля. Для запуска / остановки / запроса вашего сервиса в systemd вы можете использовать `systemd start / stop / status jenkins.service` соответственно (без перезагрузки). sebasth 6 лет назад 0

Похожие вопросы