Как отобразить текущее дерево процессов сеанса 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$
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. Оставляю это упражнение читателю.