Команда канала к хвосту: когда первая команда прерывается?

Другая возможность состоит в том, чтобы сделать это вручную. Однако я только сделал бы это, если опции Ignacio предлагают в его ответе, недоступны:

timeout_f () {
    $1 &
    sleep $2
    kill $! # ends somecommand if still running
}

timeout_f 'somecommand --someoptions' 10 && #need 2 &'s
echo "forked.." # happens immediately
2
13.11.2013, 01:27
2 ответа

SIGPIPE только отправляется, когда программа пытается записать в закрытый канал. Это было бы довольно плохо для отправки SIGPIPE иначе: программы, которые, оказывается, имеют открытый канал, даже не могут знать о нем и не должны быть закрыты, если они никогда не взаимодействуют с каналом.

В for i in 1 2 3; do sleep 1; echo $i; done, sleep команда ничего не пишет, таким образом, она не получит сигнал. Это только когда echo выполнения, которые отправляется SIGPIPE.

В целом SIGPIPE не разработан для работы точности. Это только предназначено, чтобы гарантировать, чтобы программы, задание которых состоит в том, чтобы произвести некоторый вывод, не продолжали бежать навсегда, когда потребитель того вывода уходит. В большинстве практических сценариев программа на левой стороне канала буферизует записи, и это только получит SIGPIPE в следующий раз, когда это сбрасывает свой буфер.

Если Вы хотите остановить цикл после многих повторений, встройте ту логику в цикл.

1
27.01.2020, 22:06

На моих различных оболочках (ksh, zsh, удар), у меня есть ожидаемое поведение: я только имею 1, 2, не 3. Проблема здесь может быть связана о том, как SIGPIPE обрабатывается на Вашей версии ZSH.

Можно ли попытаться выполнить эти команды скручивание жгутов экземпляр "без ENV"? например, без псевдонима, конфигурации, и т.д...

Как вставлено комментарии, оболочка получает ошибку, когда он хочет повторить что-то (с записью () функция). Пока целая цепочка канала работает ( head процесс все еще работает, и имейте его открытый STDIN), все идет прекрасное. Но когда head завершается, вывод Вашей оболочки никуда не пойдет (поврежденный канал).

Но пока оболочка не пытается записать что-то в его stdout, он не знает, что канал повреждается и продолжает его обработку.

Таким образом Вы будете видеть "эхо 3" в отладке, которая приведет к сбою и завершает оболочку.

2
27.01.2020, 22:06
  • 1
    Вопрос: почему это не останавливается прямо, после 2 отображен. Я хочу, чтобы цикл работал два раза, не три. –  alecail 12.11.2013, 10:51
  • 2
    Считайте другой путь: первый процесс (Ваша оболочка) должен остановки, потому что переданный по каналу процесс (голова) завершает и закрывает STDIN. Затем когда Ваша оболочка хочет отозваться эхом в STDOUT (который был передан по каналу завершенной "голове") запись (), функция оболочки возвратится-1 с ошибкой 'EPIPE'. Эта ошибка в свою очередь завершает оболочку. Если у Вас есть система управления обработкой ошибок в zsh, или какая-либо конфигурация или прерывание, вывод может все еще быть отражен в Вашей оболочке. –  Adrien M. 12.11.2013, 10:59
  • 3
    OK. Таким образом, хвост закрывает канал вовремя, но глава еще не знает это.. –  alecail 12.11.2013, 11:19

Теги

Похожие вопросы