2011-08-21 34 views
6

Tôi muốn tạo bí danh bash cho tôi cây quá trình từ phiên bash hiện tại tôi đang sử dụng, tối đa là init.Làm thế nào để hiển thị cây quá trình hiện tại của một phiên bash?

Trường hợp sử dụng là để biết liệu tôi đã sử dụng lệnh bash hoặc vi 's :shell hay chưa.

Tôi đang sử dụng MacOS X. Tôi đã nghe nói về pstree, nhưng dường như chỉ hiển thị trẻ em chứ không phải mối quan hệ giữa init và quy trình hiện tại.

Trả lời

5

Tôi chắc chắn với một chút tìm kiếm trên google, bạn có thể tìm cách tải xuống và tải xuống pstree cho máy Mac. Tuy nhiên, bạn có thể làm phiên bản của người nghèo, sử dụng psppid.

ví dụ

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

Có lẽ tôi sai, nhưng có vẻ như pstree rằng, cùng với bạn phiên bản nghèo của con người, chỉ cho thấy những đứa trẻ của một quá trình. Lưu ý rằng tôi không thể sử dụng đúng phiên bản của bạn, vì 'ps' của Mac khá kém và không hỗ trợ' cmd'. Tôi muốn thấy mối quan hệ giữa init và quá trình hiện tại. Có đoán không? –

+1

Có vẻ như OS X đang sử dụng 'comm' thay vì' cmd' trong lệnh 'ps'. –

+0

phiên bản của người đàn ông nghèo chỉ nhận được tất cả các quá trình cha mẹ và con cái của họ với nhau. Đó là tất cả. – ghostdog74

1

Nếu bạn sử dụng trình quản lý gói như MacPorts, bạn có thể dễ dàng cài đặt pstree.

1

Tôi không có toàn bộ câu trả lời mà bạn đang tìm kiếm, nhưng tôi đã có một ý tưởng mà có thể di chuyển bạn đi đúng hướng. Lệnh

declare -A parent 

sẽ tạo ra một mảng kết hợp (một băm, nếu bạn nói Perl)

Bạn sẽ cần một số lệnh mà sẽ cung cấp cho bạn các cặp tên-giá trị cho PID và PPID ... tôi đoán là lệnh ps của mac có thể được thực hiện để làm điều này nếu bạn tra tấn nó đủ. Tôi sẽ sử dụng 'ps -eo' như trên, nhưng bạn sẽ muốn điền vào chỗ trống.

Sau đó, bạn có thể làm một cái gì đó như thế này:

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

tôi đã gặp khó khăn làm cho các giá trị của $ cha mẹ kiên trì bên ngoài vòng lặp while của tôi, nếu không tôi sẽ đã tạo ra một thứ hai cho vòng lặp để đi qua từ $$ quay lại init. Tôi sẽ để nó như một bài tập cho người đọc.

2

Tôi đã sử dụng Mac OS 10.7 Lion, nhưng tôi nghĩ điều này sẽ khá dễ dàng đối với các hệ vỏ giống Bourne trên các hệ thống giống Unix khác. Bạn có thể gặp sự cố với lệnh lệnh trong đối số cho ps.

tôi đặt đoạn mã sau vào một file có tên procsup.sh, trong đó xác định một chức năng vỏ đi theo cha mẹ của quá trình lên để xử lý ID 1. (Tôi thường thấy các chức năng vỏ dễ dàng hơn để làm việc với hơn bí danh.)

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

Sau đó, tôi bắt đầu một shell và nguồn gốc procsup.sh. Trong cuộc sống thực, bạn sẽ đảm bảo rằng các shell mới của bạn sẽ tự động nguồn procsup.sh khi bắt đầu, có thể là trong .bashrc cá nhân của bạn. Đầu tiên tôi kiểm tra tổ tiên từ vỏ đó. Sau đó, tôi bắt đầu vi từ vỏ đó. Như thường lệ, sự tương tác với vi đã không làm cho nó vào bảng điểm cho đến khi tôi đã :shell. cửa sổ terminal của tôi trông như thế này:

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$ 
3

này được hỗ trợ trong pstree(1) bằng cách sử dụng một tùy chọn để hiển thị cây chỉ cho một PID nói riêng và cung cấp PID quá trình hiện tại của ($$ trong Bash), Tùy chọn này được đặt tên khác nhau giữa Phiên bản được cấp phép GPL của Werner Almesberger được phân phối với Debian và phiên bản BSD của Fred Hucht được phân phối với MacOS.

  • trên Debian/Ubuntu: pstree -s $$

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

    Tóm tắt các -s tùy chọn:

    -s  Show parent processes of the specified process. 
    
  • On 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 
    

    Tóm tắt các -p tùy chọn:

    -p pid show only branches containing process <pid> 
    

Dưới đây là bí danh của bạn cho hệ điều hành MacOS:

alias psme='pstree -p $$' 
+0

Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm! Và có vẻ như một câu trả lời tốt hơn, trực tiếp hơn so với câu trả lời được chấp nhận - một người có quyền truy cập vào 'pstree' tất nhiên. – Wizek

+0

Trên OSX tôi có 'pstree $ Revision: 2,39 $ bởi Fred Hucht' và ở đây tùy chọn' -s' không hoạt động, nhưng tùy chọn '-p' đã làm:' pstree -p $$ '. –

+0

cảm ơn @AlexanderKlimetschek Tôi đã cập nhật câu trả lời để cho thấy rằng '-p' là bắt buộc đối với phiên bản pstree khác nhau được phân phối với MacOS – pneumatics

Các vấn đề liên quan