Как я могу программно получить PID активного экземпляра терминала GNOME?

Возьмите мой простой скрипт оболочки xmonitor ... http://www.ict.griffith.edu.au/anthony/software/#xmonitor Это позволяет легко компоновать все активные мониторы, не прибегая к вычислению сложных команд xrandr для каждого машина вы имеете дело.

5
задан 20 May 2012 в 03:00

22 ответа

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователю нужен какой-либо эмулятор терминала, это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс эмулятором терминала.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, развивает себя, и процесс подхватывается init, поэтому снова есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используется qdbus и dbus-интерфейс Ayatana для отображения всех окон терминала gnome и того, сфокусированы они в данный момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 25 May 2018 в 11:12
  • 1
    Это возвращает PID моего экземпляра tmux. – ændrük 7 April 2016 в 00:27
  • 2
    Это не упоминалось в вопросе :) Конечно, если у вас tmux запущен скрипт, родительский PID будет иметь значение tmux. Какая у вас полная настройка? – Sergiy Kolodyazhnyy 7 April 2016 в 00:36
  • 3
    Произвольное - ответ должен избегать делать предположения о моей настройке, где это практически возможно. – ændrük 7 April 2016 в 23:41
  • 4
    @ ændrük хорошо, какие предположения можно сделать? можем ли мы хотя бы предположить, что скрипт будет выполняться через gnome-terminal в любое время? Потому что, если ваша конечная цель заключается в определении того, выполняется ли сценарий над терминальным эмулятором, тогда будет очень сложно определить - есть тонны эмуляторов терминалов и поиск каждой возможной строки, которая является именем терминала, будет бит сложный. Конечный эмулятор - это не что иное, как другой процесс, отличающийся от других только pid – Sergiy Kolodyazhnyy 8 April 2016 в 02:05
  • 5
    Я не должен был отвлекать вас, упомянув tmux. Вместо этого подумайте, что если бы я использовал этот ответ из сценария, я бы сначала ответил «& quot ;, это возвращает PID моего экземпляра Bash. & Quot; – ændrük 8 April 2016 в 02:14

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе следующее:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователь хочет любого эмулятора терминала , это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс терминальным эмулятором.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, разворачивает себя, и процесс подбирается на init, так что опять-таки есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используются qdbus и dbus-интерфейс Ayatana, чтобы отобразить все окна с гном-терминалом и были ли они сосредоточены на момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 25 July 2018 в 18:50

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе следующее:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователь хочет любого эмулятора терминала , это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс терминальным эмулятором.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, разворачивает себя, и процесс подбирается на init, так что опять-таки есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используются qdbus и dbus-интерфейс Ayatana, чтобы отобразить все окна с гном-терминалом и были ли они сосредоточены на момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 4 August 2018 в 16:30

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе следующее:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователь хочет любого эмулятора терминала , это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс терминальным эмулятором.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, разворачивает себя, и процесс подбирается на init, так что опять-таки есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используются qdbus и dbus-интерфейс Ayatana, чтобы отобразить все окна с гном-терминалом и были ли они сосредоточены на момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 7 August 2018 в 18:36

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе следующее:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователь хочет любого эмулятора терминала , это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс терминальным эмулятором.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, разворачивает себя, и процесс подбирается на init, так что опять-таки есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используются qdbus и dbus-интерфейс Ayatana, чтобы отобразить все окна с гном-терминалом и были ли они сосредоточены на момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 10 August 2018 в 07:16

Я написал две рекурсивные функции, которые отслеживают родителей процесса

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$

. Я нашел в этом процессе следующее:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

Таким образом, мы могли бы используйте две функции и grep gnome-terminal, считая, что это то, чего хочет пользователь. Если пользователь хочет любого эмулятора терминала , это может быть проблематичным, поскольку, кроме проверки lsof для открытого устройства pts, невозможно определить, является ли процесс терминальным эмулятором.

Кроме того, есть что-то очень интересное:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm

tmux, по-видимому, разворачивает себя, и процесс подбирается на init, так что опять-таки есть препятствие.

Использование Ayatana Unity

В приведенном ниже коде используются qdbus и dbus-интерфейс Ayatana, чтобы отобразить все окна с гном-терминалом и были ли они сосредоточены на момент или нет. Это может быть позже проанализировано или отредактировано для вывода только активного / сфокусированного окна PID

Пример прогона:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

И сам код

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print $2  }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
3
ответ дан 15 August 2018 в 19:16
  • 1
    Это возвращает PID моего экземпляра tmux. – ændrük 7 April 2016 в 00:27
  • 2
    Это не упоминалось в вопросе :) Конечно, если у вас tmux запущен скрипт, родительский PID будет иметь значение tmux. Какая у вас полная настройка? – Sergiy Kolodyazhnyy 7 April 2016 в 00:36
  • 3
    Произвольное - ответ должен избегать делать предположения о моей настройке, где это практически возможно. – ændrük 7 April 2016 в 23:41
  • 4
    @ ændrük хорошо, какие предположения can мы делаем? можем ли мы хотя бы предположить, что скрипт будет выполняться через gnome-terminal в любое время? Потому что, если ваша конечная цель заключается в определении того, выполняется ли сценарий над терминальным эмулятором, тогда будет очень сложно определить - есть тонны эмуляторов терминалов и поиск каждой возможной строки, которая является именем терминала, будет бит сложный. Конечный эмулятор - это не что иное, как другой процесс, отличающийся от других только pid – Sergiy Kolodyazhnyy 8 April 2016 в 02:05
  • 5
    Я не должен был отвлекать вас, упомянув tmux. Вместо этого подумайте, что если бы я использовал этот ответ из сценария, я бы сначала ответил «& quot ;, это возвращает PID моего экземпляра Bash. & Quot; – ændrük 8 April 2016 в 02:14
Бывают случаи, когда запускается более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash , часто gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский гном-терминальный процесс, даже если несколько оболочек bash вложены:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'

Следующая универсальная версия будет работать для любой оболочки, даже если запущены другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \ $(pstree -p -a | grep -B3 $RANDOM$RANDOM \ | grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\ | grep gnome-terminal | cut -d, -f2
1
ответ дан 25 May 2018 в 11:12
  • 1
    Правда, но я думаю, что любой метод, предполагающий наличие только одного экземпляра терминала GNOME, по-прежнему принципиально ошибочен. Другой контрпример: gnome-terminal --disable-factory – ændrük 20 May 2012 в 06:02
  • 2
    См. Отредактированный ответ;) – ish 20 May 2012 в 07:28

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 25 May 2018 в 11:12

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 25 July 2018 в 18:50

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 25 July 2018 в 18:50

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 2 August 2018 в 00:59

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 2 August 2018 в 00:59

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 4 August 2018 в 16:30

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 4 August 2018 в 16:30

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 6 August 2018 в 01:10

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 6 August 2018 в 01:10

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 7 August 2018 в 18:36

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 7 August 2018 в 18:36

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 10 August 2018 в 07:16

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 10 August 2018 в 07:16

Это решение кажется самым надежным для меня. Он рекурсивно ищет родительский PID, пока не найдет тот, который принадлежит терминалу GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p $1))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
1
ответ дан 15 August 2018 в 19:16

Бывают случаи, когда работает более одного экземпляра - когда у меня открыт терминал в гостевой сессии, например

Переменная $PPID даст вам родительский процесс для текущей оболочки bash, которая часто является gnome-terminal.

Чтобы быть в безопасности, следующий будет искать родительский gnome-терминал, даже если несколько оболочек bash nested:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'


Следующая универсальная версия будет работать для любой оболочки, даже если выполняются другие экземпляры grep. Расшифровка оставлена ​​в качестве упражнения для читателя;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 `echo $SHELL |cut -d/ -f3` | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
1
ответ дан 15 August 2018 в 19:16
  • 1
    Правда, но я думаю, что любой метод, предполагающий наличие только одного экземпляра терминала GNOME, по-прежнему принципиально ошибочен. Другой контрпример: gnome-terminal --disable-factory – ændrük 20 May 2012 в 06:02
  • 2
    См. Отредактированный ответ;) – ish 20 May 2012 в 07:28

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

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