सवाल कमांड लाइन से जीएनयू / लिनक्स में किसी दिए गए प्रक्रिया के अभिभावक पीआईडी ​​कैसे प्राप्त करें?


पूछने से पहले हल किया गया: cat /proc/1111/status | grep PPid


79
2018-06-08 09:42


मूल


और तेज: grep PPid status |cut -f2 जैसे की time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); आश्चर्य है कि कुछ और तेज है? - Aquarius Power
@AquariusPower चूंकि आप पूछते हैं, fgrep grep से तेज़ है। fgrep PPid status |cut -f2 - jbo5112
sed grep से कट रास्ता और कटौती है: sed -rn '/PPid/ s/^.*:\s+// p' < status - Marian


जवाब:


कमांड लाइन:

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=

यदि फ़ंक्शन या स्क्रिप्ट को कोई पीआईडी ​​प्रदान नहीं किया जाता है, तो वे वर्तमान प्रक्रिया के पीपीआईडी ​​को दिखाने के लिए डिफ़ॉल्ट होते हैं।

उपनाम का उपयोग करने के लिए, एक पीआईडी ​​की आपूर्ति की जानी चाहिए।


92
2018-06-08 11:21



= कम से कम ओएस एक्स 10.8.2 पर संकेत आवश्यक नहीं है। - jtbandes
@jtbandes: यहां उपयोग किए गए बराबर चिह्न हेडर लाइन के आउटपुट को दबा देता है (लिनक्स तथा ओएस एक्स)। - Dennis Williamson


यह उन चीजों में से एक है जिसे मैं सीखता हूं, भूल जाता हूं, रिलीज़ करता हूं, दोहराता हूं। लेकिन यह उपयोगी है। Pstree कमांड का झंडा एन पर एक पत्ते के साथ एक पेड़ दिखाता है:

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

11
2018-01-31 20:32





अभिभावक पिड शैल परिवर्तनीय पीपीआईडी ​​में है, इसलिए

echo $PPID

11
2017-09-24 11:55



हां, लेकिन 1. मुझे अन्य प्रक्रिया के पैरेंट पिड चाहिए, 2. मैं सभी पूर्वजों को init करने में सक्षम होना चाहता हूँ। - Vi.
दूसरी ओर, का उपयोग कर $PPID मैंने उस समस्या को हल किया जो मैंने किया था, जिसे Google ने इस पृष्ठ को उत्तर के रूप में सुझाव दिया था। - Paul Whittaker


यह आदेश:

ps j

अभिभावक आईडी मुद्रित करेगा (PPID) सभी प्रक्रियाओं के।

एकल प्रक्रिया के लिए, बस पीआईडी ​​पास करें, जैसे: ps j 1234

केवल मूल्य निकालने के लिए, आउटपुट फ़िल्टर करें awk, पसंद:

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

सभी माता-पिता के पीआईडी ​​सूचीबद्ध करने के लिए, फिर उपयोग करें pstree, पसंद:

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

वर्तमान प्रक्रिया के पैरेंट पीआईडी ​​प्राप्त करने के लिए, फिर उपयोग करें echo $$


6
2018-02-19 21:31



pstree मैंने यहां देखा सबसे अच्छा है। - sudo


पढ़ें / proc / $ पीआईडी ​​/ स्थिति। आसानी से लिखित किया जा सकता है:

#! / Bin / श
पी = $ 1
अगर [-z "$ पी"]; फिर
    पी पढ़ें
फाई
बिल्ली / proc / "$ पी" / स्थिति | grep पीपीआईडी: | grep -o "[0-9] *"

5
2018-06-08 09:44



grep '^PPid:' /proc/$1/status | grep -o '[0-9]*' आपको जो चाहिए वह यह है। (यह है बहुत असामान्य यूनिक्स टूल्स के लिए if [ -z ]; then read चीज़।) - grawity
@ ग्रोटीटी यह चीजों को करने में मदद करता है echo $$ | ppid | ppid | ppid - Vi.
यूयूओसी बिल्ली का बेकार उपयोग - Felipe Alvarez
@FelipeAlvarez, मेरे हाथों को टाइप करने के लिए उपयोग नहीं किया जाता है < /some/file grep | grep | ...। - Vi.
व्हाट अबाउट grep /some/file - Felipe Alvarez


लिनक्स पर:

ps hoppid $thatprocess

3
2017-10-21 17:30





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

थोड़ा और जटिल उदाहरण जो वर्तमान प्रक्रिया शुरू करने वाले माता-पिता के आदेश की जांच करता है पूर्ण आदेश देखने के लिए comm = to cmd = बदलें


2
2017-10-19 20:08



बेकार उपयोग गूंज? ;) - bobbogo
यह वास्तव में कुछ टर्मिनलों पर आवश्यक है। ईमानदार होने के लिए मुझे बिल्कुल याद नहीं है लेकिन वास्तव में यह एक समस्या हल हो गई है। : डी - sebastian_t