这个问题通常是由具有无限递归的进程引起的。
以下是一个示例脚本,它在调用自己时通过管道将输出传递给另一个实例:
#!/bin/bash
if [[ ! -p /tmp/fifo ]]; then
mkfifo /tmp/fifo
fi
echo "Hello from $$"
cat /tmp/fifo | $0 &
date > /tmp/fifo
echo "Goodbye from $$"
当脚本运行时,它会产生以下输出:
Hello from 10042
Hello from 10043
Hello from 10044
...
这表示脚本创建了越来越多的子进程,直到达到操作系统的最大进程限制为止。要解决这个问题,您可以尝试以下方法之一:
#!/bin/bash
if [[ ! -f /tmp/file ]]; then
touch /tmp/file
fi
echo "Hello from $$"
$0 < /tmp/file &
date >> /tmp/file
echo "Goodbye from $$"
在这个示例中,脚本将输出写入一个文件,然后使用重定向来将文件中的内容传递给子进程。
如果您必须使用命令替换来调用另一个程序,则应确保该程序不会产生无限递归。您可以在程序中添加一些逻辑,例如检测环路或使用循环计数器来防止无限递归。
无论您选择哪种方法,都应该避免在子进程中重定向它们自己的输出,以免造成进程的无限递归。