Хотя подобные вопросы спросили, прежде на этом форуме здесь, здесь и здесь, мой вопрос отличается. Я хочу получить PID рабочего процесса удара в терминале гнома.
Примечание: Предложенная ссылка, которая отправленный модераторами не предоставляет рабочего решения. Я не понимаю, что люди по неосведомленности голосуют за закрытие моей темы.
Команды как
xprop | awk '/PID/ {print $3}' | xargs ps h -o pid,cmd
xprop _NET_WM_PID | cut -d' ' -f3
дайте мне, только терминал гнома порождает PID не, колотят идентификатор процесса
Если я работаю
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 родительского терминала гнома
Существует ли способ достигнуть того, что я хочу?'
Править: Около ответа Dmitry Alexandrov я также нашел другое рабочее решение здесь, Как знать pid активного окна
EDIT2: Я говорил слишком рано. Я не знаю, почему, но выше решения не работает надежно. Таким образом, я использую решение Dmitry Alexandrov, оно работает хорошо кроме незначительного сбоя в моем сценарии.
#!/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
Если терминал имеет только один процесс оболочки, я не вижу проблемы.
read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"
Работы для XTerm, должен работать на Терминал GNOME также, я верю.
Иначе †“, если может быть больше чем одна оболочка, работающая при единственном терминальном процессе (в нескольких окнах, вкладках, регионах, через мультиплексор, и т.д.), it’s не ясна из вопроса, что Вы хотите.