[英]Why does “tee /tmp/my.log | my-binary” not exit immediately when my-binary is killed?
我有以下腳本:
我的腳本
#!/bin/bash
set -e
set -o pipefail
tee /tmp/my.log | my-binary
...運行如下:
$ cat my-data.txt | my-script.sh
我假設當我的二進制文件崩潰或被殺死時,腳本和 tee
副本應立即退出。 但是,當外殼本身退出時, tee
不會退出。
tee
的POSIX規范指定,如果對命名操作數(例如/tmp/my.log
)的寫入失敗,則tee
命令需要繼續寫入其他輸出。
為了滿足此規范, tee
常見實現(包括GNU實現和Busybox一個)完全忽略了SIGPIPE。 即使/tmp/my.log
是一個提前關閉的命名管道,這也允許他們繼續操作。
由於SIGPIPE信號的副作用-當FIFO的另一端中止時收到-被忽略,因此tee
不會立即通知關閉它到my-binary
的stdin的輸出,而是稍后才通知。嘗試寫入失敗。
如果立即殺死tee
很重要, 並且您正在運行bash 4.4或更高版本,我建議改為使用以下實現:
#!/usr/bin/env bash
# replace stdin with a pipe from tee
exec < <(tee /tmp/my.log)
# collect PID for the process substitution; REQUIRES BASH 4.4 OR NEWER
tee_pid=$!
trap 'kill "$tee_pid"' EXIT
my-binary
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.