Хотя подобные вопросы, заданные ранее на этом форуме здесь, здесь и здесь, мой вопрос отличается. Я хочу получить PID запущенного процесса bash в терминале gnome.
Примечание. Рекомендуемая ссылка, опубликованная модераторами, не дает никакого рабочего решения. Я не понимаю, что люди неохотно голосуют за закрытие моей темы.
Команды, подобные
xprop | awk '/PID/ {print $3}' | xargs ps h -o pid,cmd
xprop _NET_WM_PID | cut -d' ' -f3
, дают мне только родительский родительский идентификатор родительского PID не bash ID
Если я запустил
PID=$$; echo $PID
] или
cut -d ' ' -f 4 /proc/self/stat
дает мне точный PID терминала, но я должен запустить эти команды в терминале, чтобы получить PID.
У меня есть сценарий, который переключает процесс терминала между kill -STOP PID и kill -CONT PID с комбинацией клавиш быстрого доступа.
#!/bin/bash
myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')
if [[ $myid == "Sl" ]]
then
kill -STOP `xdotool getwindowfocus getwindowpid`
else
kill -CONT `xdotool getwindowfocus getwindowpid`
fi
Как я уже говорил, строка myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')
возвращает только PID родительского гнома-терминала [ ! d7]
Есть ли способ достичь того, чего я хочу? `
EDIT: Кроме ответа Дмитрия Александрова, я нашел здесь еще одно рабочее решение здесь
EDIT2: Я говорил слишком рано. Я не знаю, почему, но выше решение не работает надежно. Поэтому я использую решение Дмитрия Александрова, оно работает хорошо, кроме глюка в моем скрипте.
#!/bin/bash
read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
mypid=$(echo $SH_PID | awk ' { print $2 } ' )
myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
if [[ $myid == "Sl" ]]
then
kill -STOP $mypid
else
kill -CONT $mypid
fi
Note: Process STAT is not reliable, it doesn't always toggle between Sl and T, it sometimes takes different states such as `Ss+` `S<`
EDIT3:
Это хорошо работает
#!/bin/bash
read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
mypid=$(echo $SH_PID | awk ' { print $2 } ' )
myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
if [[ *$myid* == *"S"* ]]
then
kill -STOP $mypid
else
kill -CONT $mypid
fi