【发布时间】:2012-10-02 11:22:50
【问题描述】:
假设我有test.sh,如下所示。目的是通过这个脚本运行一些后台任务,不断更新一些文件。如果后台任务因某种原因被终止,应该重新启动。
#!/bin/sh
if [ -f pidfile ] && kill -0 $(cat pidfile); then
cat somewhere
exit
fi
while true; do
echo "something" >> somewhere
sleep 1
done &
echo $! > pidfile
并想将其称为./test.sh | otherprogram,例如。 G。 ./test.sh | cat.
管道没有被关闭,因为后台进程仍然存在并且可能会产生一些输出。如何告诉管道在test.sh 结束时关闭?有没有比在调用管道命令之前检查 pidfile 是否存在更好的方法?
作为一种变体,我尝试在test.sh 的末尾使用#!/bin/bash 和disown,但它仍在等待管道关闭。
我实际尝试实现的目标:我有一个“状态”脚本,它收集各种脚本的输出(uptime、free、date、get-xy-from-dbus 等),类似于 @987654334 @ 这里。脚本的输出被传递给我的窗口管理器,它会显示它。它也用于我的 GNU 屏幕底线。
由于使用的某些脚本可能需要一些时间来创建输出,我想将它们从输出集合中分离出来。所以我把它们放在一个while true; do script; sleep 1; done 循环中,如果它还没有运行,它就会启动。
现在的问题是我不知道如何告诉调用脚本“真正”分离守护进程。
【问题讨论】:
-
能否告诉我们,脚本的终止条件是什么?我的意思是,“等待”过程预计何时结束?
-
脚本应该在结束后终止。如果它的输出没有通过管道传输,它会正确终止,即。 e.只是打电话给
./test.sh。 -
我想我理解了你的问题。我会努力寻找答案。
标签: bash pipe sh background-process