Как отобразить текущее дерево процессов сеанса bash?

Я хотел бы создать псевдоним bash, который дает мне дерево процессов из текущего сеанса bash, который я использую, до init.

прецедент должен знать, использовал ли я bash или vi ' s .

Я использую MacOS X. Я слышал о pstree, но, похоже, он показывает только детей, а не отношения между init и текущим процессом.

5 ответов


Я уверен, что с немного поиска Google, вы можете найти, как получить и скачать pstree для Mac. Тем не менее, вы можете сделать версию бедного человека, используя ps и ppid.

например

ps -eo ppid,pid,cmd | awk '{p[]=p[]","}END{ for(i in p) print i, p[i]}'

это подтверждается в pstree(1) С помощью опции для отображения дерева только для определенного PID и предоставления PID текущего процесса ($$ в Bash), опция названа по-разному между GPL-лицензионной версией Вернера Альмесбергера, распространяемой с Debian, и версией BSD Фреда Хучта, распространяемой с MacOS.

  • На Debian / Ubuntu:pstree -s $$

    init───gnome-terminal───bash───pstree
    

    итог -s вариант:

    -s     Show parent processes of the specified process.
    
  • На MacOS: pstree -p $$

    -+= 00001 root /sbin/launchd
     \-+= 25706philipbranning/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
       \-+= 25716 root login -pfl philipbranning /bin/bash -c exec -la bash /bin/bash
         \-+= 25722 philipbranning -bash
           \-+= 32456 philipbranning pstree -p 25722
             \--- 32457 root ps -axwwo user,pid,ppid,pgid,command
    

    итог :

    -p pid    show only branches containing process <pid>
    

вот ваш псевдоним для MacOS:

alias psme='pstree -p $$'

я использовал Mac OS 10.7 Lion, но я думаю, что это будет довольно портативным для Bourne-подобных оболочек на других Unix-подобных системах. У вас могут быть проблемы с команда ключевое слово в аргументе ps.

Я поместил следующий код в файл с именем procsup.sh, который определяет функцию оболочки для отслеживания родителей процесса до идентификатора процесса 1. (Я часто нахожу, что функции оболочки легче работать, чем псевдонимы.)

procsup()
{
     leaf=$$
     ps -eo pid,ppid,command | awk -v leaf="$leaf" \
        '{parent[]=;command[]=;}                                                                                                   
     function print_ancestry(pid)                                                                                                          
     {                                                                                                                                     
         print pid " (" command[pid] ") child of " parent[pid];                                                                            
         if(pid!=1) print_ancestry(parent[pid])                                                                                            
     };                                                                                                                                    
     END{\                                                                                                                                 
         print_ancestry(leaf)                                                                                                              
     }'
}

затем я начал оболочку и sourced procsup.sh - ... В реальной жизни вы гарантируете, что ваши новые оболочки будут автоматически исходить procsup.sh когда начинали, может быть, в личном .bashrc следующее. Сначала я проверил предков по этой раковине. Затем я начал vi из этой оболочки. Как обычно, взаимодействие с Ви не дошло до стенограммы, пока я не сделал :shell. Мое окно терминала выглядело так:

Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ . procsup.sh
Mariel:~/Library/Scripts 1j david$ procsup
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ vi

bash-3.2$ # Have just done :shell.
bash-3.2$ . procsup.sh
bash-3.2$ procsup
42325 (/bin/bash) child of 42324
42324 (vi) child of 41926
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
bash-3.2$
bash-3.2$

Если вы используете менеджер пакетов, как MacPorts вы можете легко установить pstree.


declare -A parent

создать ассоциативный массив (хэш, если вы говорите на языке Perl)

вам понадобится команда, которая даст вам пары имя-значение для PID и PPID... я предполагаю, что команду ps mac можно заставить сделать это, если вы достаточно мучаете ее. Я собираюсь использовать "ps-eo", как указано выше, но вы захотите заполнить холостые патроны.

затем вы можете сделать что-то вроде этого:

ps -eo pid,ppid | while read pid ppid
do   
   parent[$pid]=$ppid   
   echo "pid: $pid ppid: ${parent[$pid]} grandppid: ${parent[${parent[$pid]}]}"
done

у меня возникли проблемы с сохранением значений $parent вне моего цикла while, иначе я бы создал второй цикл для перехода от $$ back к init. Оставляю это упражнение читателю.