私が使用している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」ユーザーとして自動的に実行したいと思います。同様に、マシンがシャットダウンされたときに、このプロセスを正常に停止したいと思います。
私が言っているのは、このアプリケーションをサービスとして実行したいということだと思います。 (「サービス」という用語の使用が正確に正しくない場合は、訂正してください。)
どうすればこれを達成できますか?
最初の回答が投稿された後に追加された追加情報
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に直接配置することはまだ正しいですか、それともこのリンクのパターンを理解して複製する必要がありますか?
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は、他のサービスの前後にサービスを開始するなど、利用可能なオプションに関する詳細を提供します。