Пришёл вопрос про правило супервизора, которое считает остановленный процесс завершённым, и маленький пример сразу показывает, в чём беда.
Шаг на shell пишет входной файл, после него запланирован потребитель. Писателя приостанавливают на полпути. Супервизор видит событие остановки, и предложенное правило по нему запускает потребителя. Вот сторона писателя на обычном Bash.
writer() {
for i in 1 2 3; do echo "row $i"; sleep 1; done > out.csv
}
writer &
pid=$!
sleep 1.5
kill -STOP "$pid"
ps -o stat= -p "$pid" # T
wc -l < out.csv # 2
kill -CONT "$pid"
wait "$pid"
wc -l < out.csv # 3
Пока он остановлен, ps показывает T, а в файле две строки из трёх. Потребитель, запущенный в этот момент, читает короткий файл, который выглядит вполне корректно, ведь каждая строка в нём целая. Ничто в файле не говорит, что будет ещё. Возобновите писателя, и третья строка появится, когда потребитель уже отработал на двух.
Остановлен не значит завершён. В Bash приостановленное задание висит в jobs как Stopped, и fg или bg сразу возвращают его к работе. Вывод тоже ещё никто не проверял. И длиться это состояние может сколько угодно. Задание, остановленное в терминале через Ctrl-Z, может простоять, пока кто-нибудь о нём не вспомнит.
Скорее всего, правило выросло из отображения статусов, где всего две корзины, работает и не работает. Остановленный писатель не работает, попадает в одну корзину с завершёнными, и потребитель стартует.
Так что должен требовать супервизор, прежде чем запускать потребителя, и как показывать писателя, пока тот приостановлен? Мне хочется завести на панели третье состояние, но сначала интересно, где проводят границу другие.