什么是systemd PID文件?

Sek*_*har 10 linux redhat systemd centos7

我想将 jar 文件作为守护进程运行。所以我写了一个shell脚本来“启动|停止|重启”守护进程。我没有机会了解它的工作状态。我可以在不创建 PID 文件的情况下使用此脚本吗?为什么我们需要一个PID文件?在什么情况下我们应该使用PID文件?

下面是我的 UNIT 文件。

[Unit]
Description=myApp
After=network.target

[Service]
Environment=JAVA_HOME=/opt/java/jdk8
Environment=CATALINA_HOME=/opt/myApp/
User=nzpap
Group=ngpap
ExecStart=/kohls/apps/myApp/myapp-scripts/myapp-deploy.sh
Restart=always

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我没有通过浏览互联网获取有关 PID 概念的信息。

Ale*_*lke 17

以下是systemd 支持的参数的文档。PIDFile=<path-to-pid>

这个想法是,许多现有服务都会执行 a fork(),并且您无法控制该服务是否应该分叉。所以在这种情况下你想使用这个选项。

由于您正在创建自己的服务,因此需要阅读的重要部分是第二段,它告诉您根本不要使用PID 文件。正如你所说:没有用。特别没用,因为你可以使用以下命令获取 PID:

systemctl [--user] show --property MainPID --value <service>
Run Code Online (Sandbox Code Playgroud)

注:--user用于查询用户特定服务

.service文件中,您可以使用名为的特殊变量访问该 PID,$MAINPID如下所示:

ExecStop=/bin/kill "$MAINPID"
Run Code Online (Sandbox Code Playgroud)

此外,该进程的任何子进程都将位于使用相同数字的组中$MAINPID,因此您可以使用相同的数字获取子进程列表,如下所示:

pgrep --pgroup $MAINPID
Run Code Online (Sandbox Code Playgroud)

当您检查进程状态时,也可能会出现此列表:

systemctl status <service>
Run Code Online (Sandbox Code Playgroud)

如果有效,请查看该CGroup: ...字段。这并不适用于所有服务。

PIDFile=

采用引用服务的 PID 文件的路径。建议对以下服务使用此选项Type=。指定的路径通常指向下面的文件/run/。如果指定了相对路径,则其前缀为/run/. 服务启动后,服务管理器会从该文件中读取该服务主进程的PID。服务管理器不会写入此处配置的文件,但如果该文件仍然存在,它会在服务关闭后删除该文件。PID 文件不需要由特权用户拥有,但如果它由非特权用户拥有,则会强制实施附加安全限制:该文件可能不是指向其他用户拥有的文件的符号链接(无论是直接还是间接) ,并且 PID 文件必须引用已经属于该服务的进程。

请注意,现代项目中应避免使用 PID 文件。尽可能使用 Type=notify 或 Type=simple,这样不需要使用 PID 文件来确定服务的主进程,并避免不必要的分叉。

注1:强调是我添加的。

注意 2:如果您确实在 systemd 中使用 PID 文件,则它应该位于下面,/run/...或者您必须指定完整路径(以 开头的路径/)。


Avi*_*ash 1

我想你想systemd为你的jar文件进行设置。你的systemd脚本应该没问题。

PIDFile =:如果服务类型标记为“forking”,则该指令用于设置应包含应监视的主子进程 ID 号的文件的路径。

ExecStart=/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
Run Code Online (Sandbox Code Playgroud)

PID文件也可用于kill信号。

ExecStart=/usr/bin/java -cp target/your_file.jar &
ExecStop=/bin/kill -TERM $MAINPID
Run Code Online (Sandbox Code Playgroud)