关于命令cmd1.sh | grep "message"
,其中cmd1.sh如下
#!/bin/bash
echo "message from foreground father proess$(date)"
setsid sleep 100 &
echo "message from foreground father proess$(date)"
echo "message from foreground father proess$(date)"
父进程启动了一个后台子进程sleep 100
,并且比子进程更早完成
您会发现cmd1.sh
运行良好但却cmd1.sh | grep "message"
挂起了,我理解这是因为子进程连接到管道。
cmd1.sh | grep "message"
那么有哪位专家可以提供一个无需更改 cmd1.sh即可退出的解决方案吗?
您需要一个打印所有内容但在结束消息后停止管道的命令,您可以使用
awk
:如果您无法区分最后一行与任何其他行,您可以使用
echo
来添加您自己的行:整个管道在打印原始二进制文件的最后一行后立即退出:
由于我无法发表评论,因此我将在这里详细介绍 Marco Guardigli。
您不需要执行
./cmd1.sh | tee logfile | grep message
grep 日志文件:我不确定您想用 pg_ctl 实现什么,但我认为最好使用操作系统的基础设施。postgres 通常通过 systemd 服务启动,因此您应该
sysmtectl restart postgres
在 docker 容器中执行 ,或者 ,因此最好重新启动整个容器。这样,您还可以使用grep
守护进程日志(journalctl
或docker logs
)我认为您可以使用 tee。
命令1 | tee 命令1.输出 | 命令2
将把命令1与命令2的命运分离。
在简单管道 C1 | C2 中,如果 C2 死亡,C1 就会收到 SIGPIPE 信号。
tee 不会将 SIGPIPE 传播到 command1,并且 command1 输出将由 tee 保存在 command1.output 文件中
感谢 tee,无论您对 command2 执行的操作都不应影响 command1 分叉的进程。