如何守护 shell 命令?

问题描述 投票:0回答:1

在 shell 脚本中,我正在启动一个长时间运行的后台进程。初始化后,该进程会写入许多行输出。在我的 shell 脚本中,我想仅在此进程初始化后(并因此开始写入输出)继续执行后续命令。

我起草了一个 shell 函数来执行此操作,但它没有像我希望的那样工作。

daemonize() {
    fifo=`basename $0`.$$
    mkfifo $fifo
    $* >$fifo &
    ( head -1; cat & ) <$fifo
    rm $fifo
}

daemonize yes
sleep 3 && kill $! && wait

我希望脚本能够输出很多行 yes 输出(持续三秒钟);但是,我得到一行输出。看来当子shell退出时,cat被杀死了。

有没有办法在 shell 中做我希望做的事情?我非常确定,在读取一行输出后,带有 fork 的单个 C 程序将完全按照我的希望进行。

shell sh io-redirection
1个回答
0
投票

从 ash 和 pdksh 派生的 shell 不会使管道的读取端在

head
cat
之间保持打开状态,您需要自己这样做。此外,管道不可查找,您将丢失数据
head

而不是

( head -1; cat & ) <$fifo
rm $fifo

exec 3<"$fifo"
rm "$fifo"
IFS= read -r line <&3
printf '%s\n' "$line"
cat <&3 &
exec 3<&-

它适用于大多数 shell。

© www.soinside.com 2019 - 2024. All rights reserved.