2016-11-01 29 views
0

我有一个我开发的用于启动Java程序的System V初始化脚本。由于某种原因,每当创建PID文件时,它都包含多个PID而不是一个。存储在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。

+1

我建议你删除最后一个awk命令,并检查这是怎么回事... –

+1

你只得到'pid'感兴趣。而不是使用'ps'使用'pgrep'。它只返回'pid'。试试'PID = $(pgrep -f​​)'。或者走捷径。不要分配给'$ PID'。试试'pgrep -f​​> $ pidfile'。 – alvits

回答

1

尝试倒转你的greps。第一个(-vE)可能在myservice启动之前运行。 grep的为您服务,然后再过滤掉不需要的行:

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