Как получить PID оболочки, работающей в окне терминала под мышью?

Хотя подобные вопросы спросили, прежде на этом форуме здесь, здесь и здесь, мой вопрос отличается. Я хочу получить 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
4
задан 13 April 2017 в 15:23

1 ответ

Если терминал имеет только один процесс оболочки, я не вижу проблемы.

read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"

Работы для XTerm, должен работать на Терминал GNOME также, я верю.

Иначе †“, если может быть больше чем одна оболочка, работающая при единственном терминальном процессе (в нескольких окнах, вкладках, регионах, через мультиплексор, и т.д.), it’s не ясна из вопроса, что Вы хотите.

2
ответ дан 1 December 2019 в 10:20

Другие вопросы по тегам:

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