openlang

Остановленное задание оболочки ещё не завершено

Вопрос про правило супервизора, которое считает остановленный процесс завершённым.

Шаг оболочки пишет входной файл, после него запланирован потребитель. Писатель приостанавливается на полпути. Супервизор получает событие об остановке, и предложенное правило по нему запускает потребителя.

Остановлен ещё не значит завершён. В Bash приостановленное задание висит в jobs как Stopped, а fg или bg сразу возвращают его к выполнению. Вывод к тому же ещё никто не проверял.

Так что должен потребовать супервизор, прежде чем запускать потребителя, и как ему показывать писателя, пока тот приостановлен?

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Состояние Stopped означает ожидание, и супервизор должен показывать его именно так. fg или bg возвращают писателя к выполнению, а потребитель всё ещё не готов. До готовности два рубежа. Писатель завершается успешно. Затем файл проверяется на то, может ли потребитель им пользоваться.

    Если супервизор написан на Python, всё так же. Каждая задача должна через await дождаться настоящего завершения своего внешнего шага. TaskGroup ждёт свои задачи при выходе из блока, поэтому задача, которая возвращается, едва увидев событие остановки, отмечает не ту веху, и группа спокойно идёт дальше. Даже у правильно завершившейся задачи вывод проверяется прежде, чем от него что-то начнёт зависеть. И пропускайте CancelledError во время ожидания, чтобы отмена супервизора по-прежнему работала.

  2. Ссылка на ответ

    Забавно, но PowerShell называет тем же словом почти противоположное состояние. Фоновое задание показывает Stopped после Stop-Job, и это значит, что его завершили и оно не вернётся, а состояние паузы с возобновлением называется Suspended, и поддерживают его только некоторые типы заданий. Так что супервизор, который сопоставляет состояния разных оболочек по имени, ошибается в обе стороны. Потребителю нужен Completed плюс проверка выходного файла, а всё остальное, включая Stopped, лучше считать неготовым. К слову, объект задания отдаёт своё состояние как свойство. Не нужно разбирать вывод jobs, и это половина причин, почему мне нравятся объекты в конвейере.

  3. Ссылка на ответ

    Пишем в out.tmp. Только если wait "$pid" вернул 0, делаем mv out.tmp out и запускаем потребителя. В скрипте управление заданиями выключено, и wait продолжает ждать во время остановки. С включённым управлением остановка может досрочно завершить ожидание с ненулевым статусом, но проверку это всё равно не пройдёт. Недописанный файл никогда не получает настоящее имя.

Другие стороны того же вопроса

  1. module-info.java не список зависимостей

    Модульный Java-проект описывает зависимости дважды. Скрипт сборки говорит, какие артефакты скачать и на какой путь положить.…

    Ответы 1javagroovy