PID фонового процесса можно получить из $! переменная среды, если она была переведена в фоновый режим (путем добавления & в конец вашей команды ), т.е.
my-cmd &
echo $!
Еще один вариант, который вы можете изучить, — это использование $$ (pid текущей оболочки )в исполняемой оболочке, например.
exec sh -c 'echo $$ > t.pid && sleep 10' &
echo $! # <-- pid of spawned shell
pid=$(cat t.pid) # <-- pid of execed process in shell
Что-то вроде этого даст вам pid во временном файле с именем t.pid
Единственный способ заставить это работать, не нарушая мой EVAL, это:
runner () {
echo -e "started running\n"
"${@}" 1> >(2log) 2> >(2log2scr | tee >&2)
while [ -e /proc/$! ]; do sleep 0.1; done
echo -e "$pid finished running\n"
}
Разница здесь в том, что я просто обращаюсь к $!
без каких-либо предварительных требований. Во всех предложениях везде упоминается, что $! доступна, если мы назовем нашу подпрограмму так:
my-cmd &
echo $!
Кажется, что это не является обязательным требованием, и что мы можем просто получить доступ к $!
после любой сложной процедуры, такой как "${@}" 1> >(2log) 2> >(2log2scr | tee >&2)
, без использования '&' где-либо