1 回答

TA贡献1866条经验 获得超5个赞
这是来自Cmd.wait的文档,重点是:
func (c *Cmd) Wait() error
Wait 等待命令退出并等待任何复制到 stdin 或从 stdout 或 stderr 复制完成。
这意味着它将等待所有进程关闭相关管道,而不仅仅是给定进程退出。当您在后台启动进程时,这是一个问题:
这是一个例子:
#!/bin/bash
sleep 3600 &
echo "Exit"
sleep继承 stdin/out/err 并让它们打开一个小时。它会在终端中立即退出,因为 Bash 不关心终端打开了什么:
$ ./testscript; echo "Returned"
Exit
Returned
$
但是,如果您通过管道传输到cat,它将等待所有潜在数据完成(以防万一sleep决定稍后再写一些东西),然后 bash 依次等待cat:
$ ./testscript | cat; echo "Returned"
Exit
(Hangs for an hour)
您可以通过确保任何分叉进程不会通过重定向到其他地方写入管道来解决此问题:
#!/bin/bash
sleep 3600 < /dev/null > /dev/null 2>&1 &
echo "Exit"
由于sleep不再保持管道打开,它会立即返回,无论是在 shell 中还是在Cmd.Wait():
$ ./testscript | cat; echo "Returned"
Exit
Returned
- 1 回答
- 0 关注
- 152 浏览
添加回答
举报