在 Debian 8 下将可执行文件作为服务运行

在 Debian 8 下将可执行文件作为服务运行

以下是我正在使用的 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:~#

为了完成我的工作,我以以下身份登录到这台机器并执行此命令:

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

该应用程序运行一个网络服务器,然后我从其他地方访问它。

我创建了一个常规的非特权“jenkins”用户,以该用户的身份运行此帐户。当机器启动时,我希望上面显示的命令自动以这个新的“jenkins”用户身份运行。同样,当机器关闭时,我希望这个过程能够正常停止。

我想说的是,我希望这个应用程序作为服务运行。(如果我对“服务”一词的使用不完全正确,请纠正我。)

我怎样才能实现这个目标?

第一个答案发布后添加了附加信息

我似乎都有systemd在里面

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

您可能正在运行 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 enable jenkinssystemctl start jenkins.service从命令行启动服务。有关完整文档,请参阅手册页.系统主页还有很多材料可供进一步研究。

如果您使用 SysV 风格的 init,您需要编写一个 init 脚本来启动您的守护进程/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 {start|stop}"
    exit 1
    ;;
esac

exit 0

请注意,你必须在 init 脚本中 fork 你的服务,否则你的脚本不会退出,在此示例中啟動-停止啟動程式 执行分叉 ( --background) 和更改用户 ( --chuid)。要了解如何使用 init 脚本在系统中启动其他服务,您可以研究 中的文件/etc/init.d/

要使服务在启动时启动,请运行update-rc.d jenkins enable。要启动服务,请运行您的新脚本/etc/init.d/jenkins start

LSB 兼容的 init 脚本也向后兼容 systemd。请记住/lib/lsb/init-functions在直接执行脚本时使用 source 以使 systemctl 透明地工作。

Debian维基百科LSBInitScripts 提供了有关可用选项的更多详细信息,例如在其他服务之后/之前启动该服务。

相关内容