簡體   English   中英

為什么“ tee /tmp/my.log | 我的二進制文件被殺死時,不是立即退出嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM