วิธีรับ parent PID ของกระบวนการที่กำหนดใน GNU / Linux จากบรรทัดคำสั่ง


90

แก้ไขก่อนถาม: cat /proc/1111/status | grep PPid


เร็วกว่า: grep PPid status |cut -f2เหมือนในtime(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); สงสัยว่ามีบางสิ่งที่เร็วขึ้น?
กุมภ์อำนาจ

1
@AquariusPower ตั้งแต่ที่คุณถาม fgrep เร็วกว่า grep fgrep PPid status |cut -f2
jbo5112

sed เป็นวิธีที่เร็วกว่าและตัด grep:sed -rn '/PPid/ s/^.*:\s+// p' < status
แมเรียน

คำตอบ:


107

บรรทัดคำสั่ง:

ps -o ppid= -p 1111

ฟังก์ชั่น:

ppid () { ps -p ${1:-$$} -o ppid=; }

นามแฝง (ฟังก์ชั่นเป็นที่นิยม ):

alias ppid='ps -o ppid= -p'

สคริปต์:

#!/bin/sh
pid=$1
if [ -z $pid ]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

หากไม่มีการระบุ PID ให้กับฟังก์ชันหรือสคริปต์ค่าเริ่มต้นจะแสดง PPID ของกระบวนการปัจจุบัน

ในการใช้นามแฝงจะต้องระบุ PID


=สัญญาณที่ไม่จำเป็นต้องมีอย่างน้อยใน OS X 10.8.2
jtbandes

5
@jtbandes: เครื่องหมายเท่ากับที่ใช้ที่นี่ระงับเอาต์พุตของบรรทัดส่วนหัว ( LinuxและOS X )
Dennis Williamson

13

นี่คือสิ่งหนึ่งที่ฉันเรียนรู้ลืมเรียนรู้ทำซ้ำ แต่มันมีประโยชน์ ธงของคำสั่ง pstree แสดงต้นไม้ที่มีใบไม้ที่ N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks

12

parent pid อยู่ในตัวแปรเชลล์ PPID ดังนั้น

echo $PPID

1
ใช่ แต่ 1. ฉันต้องการ pid พาเรนต์ของกระบวนการอื่น 2. ฉันต้องการที่จะสำรวจบรรพบุรุษทั้งหมดเพื่อเริ่มต้น
วิ

1
ในทางกลับกันการใช้$PPIDไม่ได้แก้ปัญหาที่ฉันมีซึ่ง Google แนะนำหน้านี้เป็นคำตอบ
Paul Whittaker

12

หากต้องการพิมพ์รหัสผู้ปกครอง ( PPID) ของกระบวนการทั้งหมดให้ใช้คำสั่งนี้:

ps j

สำหรับขั้นตอนเดียวเพียงผ่าน PID ps j 1234เช่น:

หากต้องการแยกเฉพาะค่าให้กรองตัวกรองผลลัพธ์ด้วยawkเช่น:

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

ในการแสดงรายการ PID ของผู้ปกครองทั้งหมดให้ใช้pstree(ติดตั้งหากคุณไม่มี):

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

ที่จะได้รับ PID echo $$แม่ของกระบวนการปัจจุบันใช้


1
pstreeเป็นคนที่อร่อยที่สุดที่ฉันเคยเห็นที่นี่
sudo

ps jดีมากเพราะมีให้บริการในหลาย distros และสามารถเรียบเรียงได้ง่าย
Connor McCormick

6

อ่าน / proc / $ PID / สถานะ สามารถเขียนสคริปต์ได้อย่างง่ายดาย:

#! / bin / ดวลจุดโทษ
P = $ 1
ถ้า [-z "$ P"]; แล้วก็
    อ่านหน้า
Fi
cat / proc / "$ P" / สถานะ | grep PPid: | grep -o "[0-9] *"

2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'คือทั้งหมดที่คุณต้องการ (เป็นเรื่องผิดปกติมากสำหรับเครื่องมือของ Unix ที่จะทำif [ -z ]; then readสิ่งนี้)
379 grawity grawity

@grawity มันช่วยในการทำสิ่งต่าง ๆ เช่นecho $$ | ppid | ppid | ppid
Vi

2
UUOC การใช้แมวอย่างไร้ประโยชน์
เฟลิเป้อัลวาเรซ

@FelipeAlvarez < /some/file grep | grep | ...มือของฉันไม่ได้ใช้ในการพิมพ์
วิ

2
สิ่งที่เกี่ยวกับgrep /some/file
เฟลิซ


2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

ตัวอย่างที่ซับซ้อนขึ้นเล็กน้อยที่ตรวจสอบคำสั่งของพาเรนต์ที่เริ่มต้นกระบวนการปัจจุบันเปลี่ยน comm = เป็น cmd = เพื่อดูคำสั่งทั้งหมด


การใช้เสียงสะท้อนที่ไร้ประโยชน์? ;)
bobbogo

มันเป็นสิ่งจำเป็นจริง ๆ ในบางขั้ว บอกตามตรงฉันจำไม่ได้ แต่จริงๆแล้วมันแก้ปัญหาได้ : D
sebastian_t


1

เรียกใช้กับตัวเลือกสิ่งที่คุณต้องการเช่นtop-u username and -p PID

และในขณะที่topกดใช้fงานจะแสดงรายการตัวเลือกที่คุณต้องการแสดงในtopเอาต์พุตและพารามิเตอร์ที่แสดงจะแสดงเป็นตัวอักษรตัวใหญ่และพารามิเตอร์ที่แสดงหรือไม่แสดงจะแสดงเป็นตัวอักษรขนาดเล็ก

ดังนั้นโดยการป้อนตัวอักษรก่อนพารามิเตอร์คุณสามารถเปิดใช้งานหรือปิดการใช้งานมัน สำหรับ ID กระบวนการหลักที่คุณต้องป้อนbแล้วกดEnterมันจะแสดง PPID ในเอาต์พุตสูงสุด


1
มันจะถูกใช้แบบไม่โต้ตอบ ฉันรู้แล้วว่าhtopคุณสามารถกำหนดค่าPPIDคอลัมน์
วิ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.