web-dev-qa-db-ja.com

Debian8でのサービスとしての実行可能ファイルの実行

私が使用している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

このアプリケーションは、他の場所からアクセスするWebサーバーを実行します。

このアカウントを実行するための、通常の非特権の「jenkins」ユーザーを作成しました。マシンが起動したら、上記のコマンドをこの新しい「jenkins」ユーザーとして自動的に実行したいと思います。同様に、マシンがシャットダウンされたときに、このプロセスを正常に停止したいと思います。

私が言っているのは、このアプリケーションをサービスとして実行したいということだと思います。 (「サービス」という用語の使用が正確に正しくない場合は、訂正してください。)

どうすればこれを達成できますか?

最初の回答が投稿された後に追加された追加情報

systemdinitの両方があるようです。

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に直接配置することはまだ正しいですか、それともこのリンクのパターンを理解して複製する必要がありますか?

1
Dave

Inintシステムとしてsystemdを実行している可能性があります。サービスを構成するには、/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 enable jenkinsを実行します。 systemctl start jenkins.serviceはコマンドラインからサービスを開始します。完全なドキュメントについては、 manページ を参照してください。 Systemd ホームページ さらに研究するための資料もたくさんあります。

SysVスタイルのinitを使用している場合は、デーモンを/etc/init.d/で起動するinitスクリプトを作成する必要があります(例:/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 {start|stop}"
    exit 1
    ;;
esac

exit 0

Initスクリプトでサービスをフォークする必要があることに注意してください。そうしないと、スクリプトが終了しません。この例では、 start-stop-daemon フォーク(--background)とユーザーの変更(--chuid)。 initスクリプトを使用してシステムで他のサービスがどのように開始されるかを調べるには、/etc/init.d/のファイルを調べます。

起動時にサービスを開始できるようにするには、update-rc.d jenkins enableを実行します。サービスを開始するには、新しいスクリプト/etc/init.d/jenkins startを実行します。

LSB互換のinitスクリプトは、systemdの下位互換性もあります。スクリプトを直接実行するときにsystemctlが透過的に機能するように、/lib/lsb/init-functionsをソースすることを忘れないでください。

Debian wiki for LSBInitScriptsは、他のサービスの前後にサービスを開始するなど、利用可能なオプションに関する詳細を提供します。

3
sebasth