Прерывание процесса и изменение его результата

Вам необходимо переместить

[-s "/home/bleakcabal/.dnx/dnvm/dnvm.sh" ] &&. "/home/bleakcabal/.dnx/dnvm/dnvm.sh" # Загрузите строку dnvm

из вашего .profile в .bashrc (или .zshrc).

2
17.03.2019, 06:46
2 ответа

Действительно, в вашем коде diffполучает вывод killвместо program. Вы можете решить эту проблему, объединив команды перед каналом в подоболочке с ().

Другая потенциальная проблема с вашим скриптом заключается в том, что killне предназначен для ожидания завершения program; вместо этого он просто посылает ему сигнал. Поэтому вы можете столкнуться с состоянием гонки, когда diffработает, не перехватывая весь вывод program. Я советую программно дождаться завершения фонового процесса с помощью встроенной команды waitbash.

Вот пример вашего кода, содержащего вышеуказанные исправления:

#!/bin/bash
(
   ./program <input1.txt &
    PID=$!
    sleep 1
    kill -INT $PID
    wait
) | diff -y reference_output.txt -
2
27.01.2020, 22:02

Вы можете использовать замену процесса[1]:

diff -y output1.txt <(your_program & sleep 1; kill $!)

Если your_programспособен генерировать огромные объемы данных за секунду (, как при тестировании с помощью yes(1)), то diffбудет очень трудно справиться с этим, и если вы не наложите какие-то осторожные ограничения, на месте это может снести вашу память и повесить вашу машину (и в лучшем случае создаст иллюзию того, что команда какое-то время "зависает" ). Вместо yesпопробуйте скрипт slowyes, например while echo y; do sleep.01; done.

Обратите внимание, что замена процесса <(...)выполняется параллельно ,поэтому diffне будет ждать завершения, прежде чем начать обработку своих данных.

Я думаю, вам будет лучше остановить your_programпосле того, как он сгенерирует некоторое количество строк, а не через некоторое время:

diff -y output1.txt <(your_program | head -n 1000)

В этом случае your_programдолжен быть уничтожен SIGPIPE, как обычно, с левой стороны конвейера. Если ваша программа игнорирует как ошибки SIGPIPE, так и write(2), то, пожалуйста, задайте другой вопрос об этом, либо как это исправить, либо как обойти это.

[1] если ваша оболочка не поддерживает замены процессов (как /bin/shв debian, а не bash), вы также можете использовать конвейер, как в другом ответе

{ your_program & sleep 1; kill $!; } | diff -y output1.txt -

Те же оговорки применимы и к этому случаю.

1
27.01.2020, 22:02

Теги

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