使用systemd配置Java守护程序


11

我在工作中使用此定义systemd

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

调用脚本的方式如下(调用一个简单的例程,该例程在tcpip套接字上侦听并将输入追加到文件中):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

After systemctl start somejob进程显示为正在运行,以init其父进程为例:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

执行systemctl stop somejob完该过程后,不再显示(端口已关闭)。

所以一切似乎都很好

我的问题是:这是使用,运行Java守护程序的可接受解决方案systemd,还是存在警告,因此还有其他更稳定或安全的方法来实现这一目标?

Answers:


14

这是一些小的修改:

  1. 由于它侦听网络套接字,因此请使其成为的依赖项network.target
  2. nohup不需要,因为systemd它将为您守护可执行文件。
  3. 我认为单独的shell脚本可能会过大,因此只需将其合并到服务文件即可。
  4. < /dev/null由于systemd设置了适当的标准I / O上下文,因此不需要重定向(等等)。确实,如果您取消了重定向 systemd会将Java程序发送到标准输出的所有内容记录在日记中,而无需任何特殊的记录机制。
  5. &不需要或不适当地从调用shell()异步运行。
  6. 要求有特定的行为模式Type=forking,如果dæmon不遵循该行为模式,则会出错。因此,请尝试Type=simple(或Type=notify)。

因此,服务文件如下所示:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

笔记:

  1. 您不能仅将其java用作要运行的程序的名称。systemd不会搜索PATH可执行文件,并且给定的可执行文件名称ExecStart必须是绝对的。因此,如果要进行路径搜索,则必须通过shell或调用/usr/bin/env。我们/bin/sh在这里选择。
  2. 因为这是Java Type=simple必须使用的外壳exec程序,所以不能将其作为子进程运行。systemd通过主进程控制服务,该进程必须是Java,而不是父Shell进程。
  3. 因为这不是直接调用Java可执行文件,所以systemd会将名称sh放在其日记中作为服务名称。有关更多信息,请参见如何避免在系统日志中将/ usr / bin / env标记为可执行文件

据我所知,使用Systemd运行Java应用程序没有特别的警告。


1
那行不通。问题1:这不是外壳;没有重定向运算符。无论如何,您实际上并不想要这种重定向。问题2:ExecStart需要绝对路径名。问题3:unix.stackexchange.com/questions/229523
JdeBP '16

好好抬头。我只能设法解决问题1。如何解决问题2,3?
运志辰

1
查看已编辑的答案。
JdeBP '16

我认为这里不需要sh。
faho

您好@ Yun-ChihChen您如何停止该过程。ExecStrop会是什么样?我一直在使用init.d和pid文件,但发现这更容易。因此,我需要确保我知道如何停止等。谢谢
black sensei
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.