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

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

1
задан 13 April 2017 в 15:23

0 ответов

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

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