Как программно убить подпроцесс вскоре после вызова из родителя?

Что ж, записать stderr в одну переменную и stdout в другую переменную без временного файла совсем непросто.

Вот пример, который работает

func() {
    echo 'hello'
    echo 'This is an error' >&2
}

result=$(
    { stdout=$(func) ; } 2>&1
    echo -e "mysuperuniqueseparator\n"
    echo -e "${stdout}\n"
)
var_out=${result#*mysuperuniqueseparator$'\n'}
var_err=${result%$'\n'mysuperuniqueseparator*}

Меня это не устраивает, потому что это грязный способ, перенаправить stderr на stdout и поместить оба в одну переменную с разделителем между ними, а затем разбить его на две части.

Плюс:

Obviously, this is not robust, because either the standard output or the standard error of the command could contain whatever separator string you employ.

Взято отсюдаhttp://mywiki.wooledge.org/BashFAQ/002

0
21.01.2020, 05:56
1 ответ

Хитрость заключается в том, чтобы убедиться, что вы убиваете правильный процесс и только те, которые вам нужны. Звучит просто, но так много людей заблуждаются. Худший программный способ - сделать это по имени.

Итак, вы сказали, что не можете изменить родителя. Правильный способ, если бы вы могли это сделать, - это взять возвращаемое значение вызова fork (), поскольку он имеет дочерний PID. PID уникален, а имя (, которое, я думаю, вы делаете с ps aux | grep )не уникален.

Предполагая, что вы знаете PID родителя, pgrep -P может быть одним из способов сделать это. Это предполагает, что у вас есть один дочерний процесс, поскольку он будет соответствовать всем дочерним процессам родителя.

Как ни странно, killall соответствует возрасту, pgrep/pkill соответствует родительскому, но они не делают то, что делает другой; что-то исправить однажды, возможно.

0
28.04.2021, 23:25

Теги

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