【问题标题】:Multiple PIDs being stored in PID file多个 PID 存储在 PID 文件中
【发布时间】:2017-03-15 01:18:28
【问题描述】:

我有一个我开发的用于启动 Java 程序的 System V 初始化脚本。出于某种原因,每当创建 PID 文件时,它都包含多个 PID,而不是一个。

下面是启动服务并写入PID文件的相关代码:

daemon --pidfile=$pidfile "$JAVA_CMD &" >> $logfile 2>&1
RETVAL=$?
usleep 500000

if [ $RETVAL -eq 0 ]; then
    touch "$lock"

    PID=$(ps aux | grep -vE 'grep|runuser|bash' | grep <myservice> | awk '{print $2}')

    echo $PID > $pidfile

当我手动测试ps aux... 命令时,会返回一行。作为脚本运行时,此调用似乎返回了多个 PID。

PID 文件中的示例内容:16601 16602 16609 16619 1669016619 是手动运行上述ps aux... 命令时发现的实际进程ID。

【问题讨论】:

  • 我建议您删除最后一个 awk 命令并检查发生了什么...
  • 您只对获取pid 感兴趣。不要使用ps,而是使用pgrep。它只返回pid。试试PID=$(pgrep -f &lt;myservice&gt;)。或者走捷径。不要分配给$PID。试试pgrep -f &lt;myservice&gt; &gt; $pidfile

标签: linux bash init.d


【解决方案1】:

尝试反转您的 grep。第一个 (-vE) 可以在 myservice 启动之前运行。首先为您的服务 Grep,然后过滤掉不需要的行:

PID=$(ps aux | grep <myservice> | grep -vE 'grep|runuser|bash' | awk '{print $2}')

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但不一样的说法,是这样的:

    PID="$(ps -ef|grep command|grep options|grep -v grep|awk '{print $2}')"
    

    其中我使用了与@Marc 在第一个答案中所说的相同的 grep 顺序,但没有过滤所有不需要的行。 所以我尝试了下面的一个并且它有效:

    PID="$(ps -ef|grep command|grep options|grep -vE 'grep|runuser|bash'|awk '{print $2}')"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2022-11-02
      • 2011-12-28
      • 2023-03-15
      • 2015-05-05
      • 2013-08-27
      • 1970-01-01
      相关资源
      最近更新 更多