如何将pid写入文件

3

我知道这可能很容易,但我却无法弄清楚。我们想在一台机器上运行两个luigi实例,因此需要修改init.d脚本以将PID写入文件而不是只创建空文件。

echo -n $"Starting luigid scheduler as $LUIGID_USER: "
( ( /usr/bin/sudo -u $LUIGID_USER $LUIGID_BIN >>/var/log/luigid/server.log 2>&1 ) &)
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/luigid && echo_success || echo_failure
echo
return $RETVAL

目前,它只是接触空的PID文件。我希望它将PID写入文件中。 同时,在停止时,我想要通过PID文件中存储的PID来终止进程。

echo -n $"Stopping luigid scheduler: "
killproc luigid
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/luigid && echo_success || echo_failure
echo

请问有什么需要帮忙的吗?

谢谢。


1
如果进程是关键的,只允许一个进程运行,请考虑使用lockdir而不是lockfile。参见:如何确保一次只运行一个脚本实例(互斥)? - David C. Rankin
2个回答

8

您可以通过使用$!命令获取上一个命令的进程ID PID

将启动脚本更改为:

echo -n "Starting luigid scheduler as $LUIGID_USER: "
/usr/bin/sudo -u $LUIGID_USER $LUIGID_BIN >>/var/log/luigid/server.log 2>&1 &
RETVAL=$?
PID=$!
[ $RETVAL -eq 0 ] && echo $PID > /var/lock/subsys/luigid && echo_success || echo_failure
echo
return $RETVAL

请注意,需要从命令周围删除括号,因为它们会在子Shell中启动该程序。子Shell不会将启动的程序的PID返回到您的Shell,因此您应直接从Shell调用它。

这对我没有起作用。我期望在 /var/lock/subsys/luigi 中看到 PID 号码,但是并没有。 - roy
它不会输出先前命令的进程ID。我也尝试了这个命令 ( ( /usr/bin/luigid --logdir=/srv/log/luigid --state-path=/srv/log/luigid/state.pickl ) & ) && echo $! - roy
就像我说的那样,这个带有括号的代码是不会起作用的。我很难相信你什么都看不到。如果你在命令后面直接输入echo $!呢? - arco444

0

(man) shlock 应该可以解决这个问题:

shlock [-du] [-p PID] -f lockfile

...

shlock uses the link(2) system call to make the final target lock file, which
is an atomic operation (i.e. "dot locking", so named for this mechanisms 
original use for locking system mailboxes).  It puts the process ID ("PID") 
from the command line into the requested lock file.

或者根据情况(man)使用flock,一个很好的例子可以参考这个链接: http://codehackit.blogspot.fr/2013/04/locking-processes-with-flock.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接