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