Hãy nói rằng tôi chạy ps axf
và tôi có thể thấy rằng cây quá trình lệnh của tôi trông như thế này:Làm cách nào để tìm PID cấp cao nhất của một quy trình cụ thể bằng cách sử dụng bash?
800 ? Ss 0:00 /usr/sbin/sshd
10186 ? Ss 0:00 \_ sshd: yukondude [priv]
10251 ? S 0:00 \_ sshd: [email protected]/0
10252 pts/0 Ss 0:00 \_ -bash
10778 pts/0 S 0:00 \_ su -
10785 pts/0 S 0:00 \_ -su
11945 pts/0 R+ 0:00 \_ ps axf
Tôi biết tôi có thể kiểm tra $$
cho PID vỏ hiện tại (10.785) hoặc $PPID
cho phụ huynh PID (10778) .
Nhưng tôi chỉ muốn PID cấp cao nhất của cha mẹ, sẽ là 800 (SSH daemon) trong ví dụ này. Có cách nào để làm điều đó dễ dàng không?
tôi học được từ this SO answer mà tôi đệ quy có thể kiểm tra sự xâm nhập thứ 4 trong file /proc/PID/stat
để tìm PID cha mẹ của mỗi quá trình:
# cut -f4 -d' ' /proc/10785/stat
10778
# cut -f4 -d' ' /proc/10778/stat
10252
# cut -f4 -d' ' /proc/10252/stat
10251
# cut -f4 -d' ' /proc/10251/stat
10186
# cut -f4 -d' ' /proc/10186/stat
800
# cut -f4 -d' ' /proc/800/stat
1
(Các top-level mẹ PID sẽ là một trong những ngay trước khi tôi đạt init
PID của bạn, tức là, 1.)
Trước khi tôi viết một vòng lặp nhỏ (Tôi thậm chí không chắc chắn nếu bạn có thể sử dụng đệ quy trong bash) để làm điều này, có một phương pháp đơn giản hơn nhiều mà tôi đang thiếu ? Có thể chỉ là một thông số khác của tệp dưới /proc
? Một grep
thông qua các tệp đó không tiết lộ bất cứ điều gì hiển nhiên.
Chỉnh sửa: Tất nhiên, quy trình cấp cao nhất cho tất cả các quy trình Linux là/sbin/init với PID 1. Tôi muốn là PID của cha mẹ ngay trước đó: cha mẹ áp chót.
Bạn không cần đệ quy cho điều này, chỉ cần một vòng lặp đơn giản ... – JanC
Đúng, nhưng đệ quy chỉ là thú vị hơn rất nhiều và máy tính-sciency. – yukondude
Không đời nào. Các vòng lặp cơ bản hơn: P Đừng quên những công cụ cơ bản nhất của bạn. –