![使用 nohup 启动服务器并重定向输入、输出](https://linux22.com/image/30210/%E4%BD%BF%E7%94%A8%20nohup%20%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E9%87%8D%E5%AE%9A%E5%90%91%E8%BE%93%E5%85%A5%E3%80%81%E8%BE%93%E5%87%BA.png)
我有一个启动 python 套接字服务器的 init.d 脚本。因为我希望它作为守护进程运行,所以我使用 nohup 来启动它。我还想将 stdout 和 stderr 重定向到日志文件。我的问题是我还试图捕获进程的 PID 并将其保存到文件中,但我似乎无法做到这一点。
# Start server
echo "Starting server."
nohup ${PROGDIR}/${PROGNAME} -l $IPADDR >>${LOGDIR}/${OUTLOG} 2>>${LOGDIR}/${OUTLOG} </dev/null &
PID=$!
这能够捕获 PID,但重定向不起作用。 (我是重定向 nohup 而不是程序吗?)
接下来我尝试了类似的东西:
nohup /bin/bash -c '...'
但我丢失了PID。此时,我似乎得到了 的 PID nohup /bin/bash -c
。由于我对shell脚本不是很熟悉,所以我想在搬起石头砸自己的脚之前先寻求帮助。
所以我的问题是,如何捕获 PID 并将服务器输出重定向到日志文件?我使用的是 debian (raspberry pi),并且正在使用 rc-update.d 编写初始化脚本。
答案1
如果您使用的是 Debian 变体,您可以start-stop-daemon
使用它,它可以以更简洁的方式为您完成所有这一切。尤其:
start-stop-daemon --make-pidfile --pidfile "$PIDFILE" --background \
--no-close --exec "${PROGDIR}/${PROGNAME}" --start -- -l "$IPADDR" \
>> "${LOGDIR}/${OUTLOG}" 2>> "${LOGDIR}/${OUTLOG}" </dev/null
应该非常接近你想要的。它将 PID 放入文件中而不是变量中,但您当然可以轻松地将其读回变量中。