在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