我想将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
我没有通过互联网浏览有关PID概念的信息。
答案 0 :(得分:2)
pidfile 包含主要任务。因为主要任务可能能够产生更多来处理请求或其他什么。两个例子...
#pidof apache2
31583 31582 31579 31577 31576 31571 347
#pidof tinyproxy
6813 6812 6811 6810 6809 6808 6807 6806 6805 6804 6803 6802 6801 6800 6799 6798 6797 6796 6795 6794 6793
#ls /var/run/apache2/
apache2.pid cgisock.347
#cat /var/run/apache2/apache2.pid
347
#cat /var/run/tinyproxy/tinyproxy.pid
6793
答案 1 :(得分:1)
下面是 systemd 支持的 documentation of the PIDFile=<path-to-pid>
参数。
这个想法是许多现有服务都执行 fork()
并且您无法控制服务是否应该分叉。因此,在这种情况下,您要使用此选项。
由于您正在创建自己的服务,因此需要阅读的重要部分是第二段,它告诉您根本不要使用 PID 文件。正如你所说:没用。特别没用,因为您可以使用以下命令获取该 PID:
systemctl [--user] show --property MainPID --value <service>
注意:--user
用于查询用户特定的服务。
在 .service
文件中,您可以使用名为 $MAINPID
的特殊变量访问该 PID,如下所示:
ExecStop=/bin/kill "$MAINPID"
此外,该进程的任何子进程都将在一个使用相同 $MAINPID
的组中,因此您可以使用相同的数字获取子进程列表,如下所示:
pgrep --pgroup $MAINPID
当您检查进程状态时,也可能会出现此列表:
systemctl status <service>
如果可行,请参阅 CGroup: ...
字段。这不适用于所有服务。
PIDFile=
采用引用服务PID文件的路径。对于 Type=
设置为分叉的服务,建议使用此选项。指定的路径通常指向 /run/
下面的文件。如果指定了相对路径,则以 /run/
为前缀。服务启动后,服务管理器会从该文件中读取服务主进程的PID。服务管理器不会写入此处配置的文件,但如果该文件仍然存在,它会在服务关闭后删除该文件。 PID 文件不需要由特权用户拥有,但如果它由非特权用户拥有,则会强制执行额外的安全限制:该文件可能不是指向不同用户拥有的文件的符号链接(既不是直接也不是间接) , 并且 PID 文件必须引用一个已经属于该服务的进程。
请注意,在现代项目中应避免使用 PID 文件。尽可能使用 Type=notify 或 Type=simple,不需要使用 PID 文件来确定服务的主进程,避免不必要的分叉。
注意 1:强调添加了我。
注意 2:如果您确实在 systemd 中使用了 PID 文件,它应该在 /run/...
下,或者您必须指定完整路径(以 /
开头的路径)。
答案 2 :(得分:-1)
我认为您要为systemd
文件设置jar
。你的systemd
脚本应该没问题。
PIDFile =:如果服务类型标记为&#34;分叉&#34;,该指令用于设置应包含主进程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
PID
文件也可用于kill
信号。
ExecStart=/usr/bin/java -cp target/your_file.jar &
ExecStop=/bin/kill -TERM $MAINPID