अगर मुझे किसी प्रक्रिया का PID नंबर पता है, तो मैं उसका नाम कैसे ले सकता हूं?


262

अगर मेरे पास एक प्रक्रिया (UNIX मशीन पर) के लिए PID नंबर है, तो मैं इसकी संबद्ध प्रक्रिया का नाम कैसे पता लगा सकता हूं?

मुझे क्या करना होगा?


9
आप उपयोग कर सकते हैं psयाls -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em जो आपको निष्पादन योग्य फ़ाइल देगा, जो हमेशा प्रक्रिया का नाम नहीं है। इसके अलावा, कि पोर्टेबल नहीं है ...
derobert

9
ps -fp PIDपूर्ण कमांड दिखाएंगे
Temak

जवाबों:


282

सभी POSIX- आज्ञाकारी प्रणालियों पर, और लिनक्स के साथ, आप उपयोग कर सकते हैं ps:

ps -p 1337 -o comm=

यहां, इस प्रक्रिया का चयन इसके पीआईडी ​​के साथ किया जाता है -p-oविकल्प उत्पादन प्रारूप निर्दिष्ट करता है, commआदेश नाम जिसका अर्थ है।

इसे भी देखें: ps- ओपन ग्रुप बेस स्पेसिफिकेशन्स 6


28
कॉम 15 वर्णों को कमांड को छोटा करने के लिए लगता है। commandइसके बजाय उपयोग इसे ठीक करता है।
निमो

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; जिसका अर्थ है कि यह लगभग 15 वर्णों का नहीं है, शायद केवल द्विआधारी का नाम बनाम इसका पूर्ण पथ।
ओमरमनमैन

3
दरअसल, commबाइनरी का नाम commandदेता है और तर्क 0
रॉबी

45

आप प्रक्रिया-नाम या कमांड का उपयोग प्रक्रिया-आईडी या पीआईडी ​​से पा सकते हैं

/proc/pid/cmdline

ऐसा करके

cat /proc/pid/cmdline

यहाँ pid वह पीड है जिसके लिए आप नाम को खोजना चाहते हैं
:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

2480 द्वारा उपयोग की जाने वाली प्रक्रिया का नाम जानने के लिए आप इसका उपयोग कर सकते हैं

# cat /proc/2480/cmdline 

 gnome-terminal

14
सावधान रहें: ओपी ने यूनिक्स का उल्लेख किया है। सभी UNIXes योजना 9 को प्रक्रिया-विशिष्ट फ़ाइल की तरह कार्यान्वित नहीं करते हैं। आपका जवाब आम तौर पर केवल लिनक्स पर लागू होता है।
slhck

3
जबकि यह सच है, उन्होंने प्रश्न "linux" को टैग किया। जो कोई भी गैर-लिनक्स आधारित यूनिक्स OS का उपयोग कर रहा है, उसकी आवश्यकताओं को पूरा करने के लिए उत्तरों को संशोधित करने के लिए काफी उपयोग किया जाएगा
एंड्रयू व्हाइट

14

एक निश्चित पिड का उपयोग करके कार्यक्रम का पथ प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं:

ps ax|egrep "^ [PID]"

वैकल्पिक रूप से आप उपयोग कर सकते हैं:

ps -a [PID]

यहां छवि विवरण दर्ज करें


1
ps -aसभी प्रक्रियाओं को सूचीबद्ध करें जो टर्मिनल के साथ जुड़ा हुआ है, यह कोई इनपुट नहीं लेता है।
माइकल ली

@MichaelLee मुझे लगता है कि यह psसंस्करण पर निर्भर procps version 3.2.7करता है, ठीक काम करता है।
पेड्रो लोबिटो

8
# ls -la /proc/ID_GOES_HERE/exe

उदाहरण:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

यह एक सही है।
जयरोज़ो

1
शायद बेहतर readlink /proc/1337/exe:। रीडलिंक - हल प्रतीकात्मक लिंक या विहित फ़ाइल नाम।
पाब्लो ए

8

आप pmap का उपयोग कर सकते हैं। मैं पीआईडी ​​6649 खोज रहा हूं। और अतिरिक्त प्रक्रिया विवरण काट रहा हूं।

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

इस कमांड ने मुझे ज़रूरत से ज़्यादा मदद की, मेरे पास शुरू होने वाली प्रक्रिया की पूरी लाइन है। एक जावा प्रक्रिया को देखते हुए, psसभी कमांड जो आप देखेंगे, बस है java, लेकिन पारित किए गए बाकी पैरामीटर पूरी तरह से प्रदर्शित किए जाएंगे pmap
डैनियल आंद्रेई मिन्का

3

आप ps के साथ संयोजन में awk का भी उपयोग कर सकते हैं

ps aux | awk '$2 == PID number for a process  { print $0 }'

उदाहरण:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

हेड लाइन मुद्रित करने के लिए आप उपयोग कर सकते हैं

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

2
यह अस्थिर है क्योंकि यह उन प्रक्रियाओं का भी चयन करेगा जो उनके कमांड में कहीं भी संख्या को शामिल करने के लिए होती हैं। कोशिश करो ps ax | grep 1और देखो कि क्या यह वास्तव में initप्रक्रिया को लौटाता है, उदाहरण के लिए। (मेरे मामले में, यह 119 लाइनों-वांछनीय नहीं देता है।)
slhck

1
@slhck ने उत्तर को संशोधित किया ... जानकारी के लिए धन्यवाद .. ps -p 1 -o comm = इस प्रश्न के लिए सबसे अच्छा विकल्प है।
गंगाधर

हेडर को बनाए रखने के लिए हमें दो रनों की आवश्यकता नहीं है, इसके बजाय उपयोग करें ps aux | awk 'NR==1 || $2==PID'- और {print $0}यह कहने की आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट है। लेकिन जैसा कि आपने टिप्पणी की, -pवैसे भी बेहतर है।
dave_thompson_085

3

Simmilar करने के लिए उत्तर दें , लेकिन कमांड इनवॉइस के बजाय फ़ाइल संचालन पर निर्भर:

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, not / sbin / init। उनके जवाब में लंबा संस्करण शामिल है। लेकिन +1 वैसे भी।
ओमरऑथमैन

2

हैरानी की बात है, किसी ने पीएस के लिए -f (पूर्ण कमांड) विकल्प का उल्लेख नहीं किया है। मैं -e (सब कुछ) के साथ इसका उपयोग करना पसंद करता हूं और परिणामों को संक्षिप्त करने के लिए पाइप करता हूं ताकि मैं अपनी खोज को संकीर्ण कर सकूं।

ps -ef | grep <PID>

पूर्ण कमांड को देखने के लिए यह भी बहुत उपयोगी है कि कोई व्यक्ति आपके सिस्टम पर बहुत सारे संसाधन ले रहा है। यह आपको कमांड में दिए गए विकल्प और तर्क दिखाएगा।


3
बीएसडी पर काम नहीं करता है (शायद MacOSX सहित? मुझे यकीन नहीं है)। यहां तक ​​कि जहां -e -fउपलब्ध हैं, grepकई झूठे मैचों का उत्पादन कर सकते हैं जैसे कि grep 33pid = 933 या 339, ppid = 33 या 933 या 339, 33 सेकंड या 33 मिनट का समय, या प्रोग्रामनाम या तर्क जिसमें 33 शामिल हैं - जिसमें grepस्वयं भी शामिल है। सभी (AFAIK) psहै -p, तो बस ps -fp 33
dave_thompson_085

0

मुझे निम्नलिखित कमांड के साथ सबसे आसान तरीका लगता है:

ps -awxs | grep pid

की तुलना में अत्यधिक अक्षम होने के अलावा ps -p${pid}, यह बहुत सारी झूठी सकारात्मकता को उठाएगा - जिसमें grepस्वयं भी शामिल है।
टोबी स्पाइट नाइट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.