【问题标题】:What is systemd PID file?什么是 systemd PID 文件?
【发布时间】:2017-12-15 05:10:14
【问题描述】:

我想将 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 概念的信息。

【问题讨论】:

标签: linux redhat centos7 systemd


【解决方案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/... 下,或者您必须指定完整路径(以 / 开头的路径)。 p>

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      我认为您想为您的jar 文件设置systemd。你的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
      

      PID 文件也可用于kill 信号。

      ExecStart=/usr/bin/java -cp target/your_file.jar &
      ExecStop=/bin/kill -TERM $MAINPID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-14
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2017-10-23
        相关资源
        最近更新 更多