Предотвратить автоматические EOF для именованный канал и отправлять EOF, когда мне это нужно

Простой способ, который я нашел, - это команда на выключение / перезагрузку в качестве фоновой задачи (с помощью '&'), защищая ее от закрытия, когда сеанс закрывается с помощью 'nohup', вместе с немедленным завершением оболочки / сеанса :

nohup shutdown -r now & exit

Таким образом, клиент SSH не зависает, так как сеанс завершается немедленно, в то время как удаленная система выполняет асинхронную перезагрузку.

18
26.05.2017, 10:37
3 ответа

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

Поскольку вы используете сценарий оболочки, самое простое решение — указать оболочке открыть канал для записи. А затем закройте его, когда закончите.

#!/bin/sh
mkfifo P
exec 3>P # open file descriptor 3 writing to the pipe
program < P
# < P tail -n +1 -f | program
echo some stuff > P
cat more_stuff.txt > P
exec 3>&- # close file descriptor 3

Обратите внимание, что если вы пропустите последнюю строку, файловый дескриптор 3 будет автоматически закрыт (и, таким образом, считыватель получит EOF) при выходе из скрипта. Помимо удобства, это также обеспечивает своего рода безопасность, если сценарий каким-то образом завершится раньше.

17
20.08.2021, 11:39

Канал получает EOF, когда последний писатель уходит. Чтобы избежать этого, убедитесь, что всегда есть писатель (процесс, который имеет открытый канал для записи, но на самом деле ничего не записывает). Чтобы отправить EOF, отключите этот резервный модуль записи.

mkfifo P
while sleep 1; do :; done >P &
P_writer_pid=$!
send_eof_to_P () {
  kill $P_writer_pid
}
2
20.08.2021, 11:39

Программа не может различить EOF, означающий "пора заканчивать", и EOF, означающий "запись завершена, но может быть больше информации от кого-то другого". ".

Если у вас есть возможность изменить поведение вашей программы, то сделайте чтение в бесконечном цикле (одна итерация длится до EOF) и отправьте ей определенную командную строку, которая означает «время выхода». Отправка этой строки будет задачей команды send_eof в вашем вопросе.

Другой вариант:

( echo some stuff; cat more_stuff.txt ) >P

или

{ echo some stuff; cat more_stuff.txt; } >P
-1
20.08.2021, 11:39

Теги

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