在unix启动脚本中检索pid
在我编写的一个简单启动脚本中,我有:在unix启动脚本中检索pid,unix,pid,Unix,Pid,在我编写的一个简单启动脚本中,我有: PID=`su user_name -c "daemon_name > /dev/null 2>&1 & echo \$!"` echo $PID 脚本以根目录运行。回声并没有真正的回声:) 如果我在shell中输入完全相同的命令,它会工作: # su user_name -c "daemon_name > /dev/null 2>&1 & echo \$!" 11831 # 有
PID=`su user_name -c "daemon_name > /dev/null 2>&1 & echo \$!"`
echo $PID
脚本以根目录运行。回声并没有真正的回声:)
如果我在shell中输入完全相同的命令,它会工作:
# su user_name -c "daemon_name > /dev/null 2>&1 & echo \$!"
11831
#
有什么想法吗?谢谢
编辑:在我尝试以其他用户身份运行应用程序之前,它工作正常。
我以前使用过以下代码:
PID=`daemon_name > /dev/null 2>&1 & echo $!`
echo $PID
当root
尝试$$而不是$时,它工作得很好!(当前pid而不是最后一个)守护进程设计为多次分叉,因此pid很可能从$返回!将不是您以后要使用的pid。您可能需要执行以下操作:
ps -eo pid,command,lstart --sort lstart | grep 'daemon_name' | tail -1
恐怕那不是我想要的。也许我在最初的问题上不太清楚。我需要与执行daemon\u name
程序相关的pid。如果我尝试您的解决方案,我会得到一个pid响应,但当我对正在运行的进程进行grep时,我会得到另一个pid:两个pid不匹配。非常确定,backticks将运行,然后在返回到脚本之前完成。听起来您想将其作为子shell或后台进程来执行。在这种情况下没有分叉。我命名为daemon\u name
的程序实际上是一个java独立应用程序,我想“作为守护程序”运行。在实际情况中,daemon_name
实际上是一个启动java应用程序的startup.sh
脚本。我最后使用了一个变体:ps ho pid--sort lstart-C daemon_name | tail-1