एक चालू प्रक्रिया की वर्तमान कार्यशील निर्देशिका का पता लगाएं?


167

एक चल रही प्रक्रिया की वर्तमान कार्य निर्देशिका (CWD) का पता लगाने के लिए कोई क्या कमांड का उपयोग कर सकता है? ये ऐसे कमांड होंगे जिन्हें आप बाहरी रूप से प्रक्रिया से उपयोग कर सकते हैं।

जवाबों:


217

3 तरीके हैं जिनसे मैं अवगत हूं:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

$ readlink -e /proc/<PID>/cwd

उदाहरण

कहो कि हमारे पास यह प्रक्रिया है।

$ pgrep nautilus
12136

यदि हम उपयोग करते हैं तो pwdx:

$ pwdx 12136
12136: /home/saml

या आप उपयोग कर सकते हैं lsof:

$ lsof -p 12136 | grep cwd
nautilus 12136 saml  cwd    DIR              253,2    32768  10354689 /home/saml

या आप में सीधे प्रहार कर सकते हैं /proc:

$ readlink -e /proc/12136/cwd/
/home/saml

2
मैं कहूंगा / खरीद विहित है, lsof उपयोगी होने के साथ, लेकिन pwdx शांत है।
ChuckCottrill

3
सभी यूनियनों के पास नहीं है /proc
रीइन्टीरियरपोस्ट

एक समान लेकिन अलग-अलग प्रश्न: unix.stackexchange.com/questions/173868/…
Sibbs Gambling

1
pwdxमेरे लिये कार्य करता है।
एरोथ

यहाँ एक सरल तरीका है (स्लम के उत्तर से) pwdxpgrep <process-name>
मधुसूदन पी '

27

मैं मानता हूं कि आपके पास प्रक्रिया आईडी है pid। अधिकांश प्रणालियों के अधिकांश तरीकों की आवश्यकता होगी कि आप जिस शेल से यह कर रहे हैं वह उसी उपयोगकर्ता के रूप में लक्ष्य प्रक्रिया (या रूट) के रूप में चल रहा है।

लिनक्स और सोलारिस पर और शायद कुछ अन्य सिस्टम V यूनियनों में:

cd /proc/$pid/cwd && pwd

लिनक्स पर (एम्बेडेड सिस्टम को छोड़कर जहां readlinkउपलब्ध नहीं है) लेकिन सोलारिस नहीं:

readlink /proc/$pid/cwd

किसी भी यूनिक्स संस्करण के बारे में, आप उपयोग कर सकते हैं lsof। खबरदार कि अगर कोई नई रेखा है, तो इसे मुद्रित किया जाएगा \n(बैकस्लैश से अप्रभेद्य n)। यदि आप भाग्यशाली महसूस करते हैं, तो आप दूसरे रूप का उपयोग कर सकते हैं, जो चुपचाप निर्देशिका नाम के सभी व्हाट्सएप पर चुटकी लेते हैं।

lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'

बोनस: यदि आपको इसकी वर्तमान निर्देशिका को बदलने के लिए एक प्रक्रिया का कारण बनने की आवश्यकता है, तो आप इसे डिबगर के साथ कर सकते हैं। यह उदाहरण के लिए एक लंबे समय से चल रहे प्रोग्राम को स्थानांतरित करने के लिए उपयोगी है जो अपनी वर्तमान निर्देशिका के बारे में परवाह नहीं करता है जिसे आप निकालना चाहते हैं। सभी कार्यक्रम अपने पैरों के नीचे अपनी वर्तमान निर्देशिका को बदलने की सराहना नहीं करते हैं - उदाहरण के लिए एक शेल क्रैश होने की संभावना है।

#!/bin/sh

# Use gdb to change the working directory of a process from outside.
# This could be generalized to a lot of other things.

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF

चलती के बारे में विवरण जोड़ते हुए अच्छा स्पर्श। साइट पर जोड़ने के लिए अच्छा सा डला!
SLM

क्या आप pwdxअन्य यूनिक्स पर सर्वव्यापीता पर टिप्पणी कर सकते हैं ?
slm

OpenBSD पर, कम से कम, lsof केवल प्रक्रिया के CWD के आरोह बिंदु को रिपोर्ट करता है।
१०:१३

@ एसएलएम pwdx20 वीं सदी के बाद से सोलारिस पर मौजूद है, 2000 के दशक के मध्य से लिनक्स (सोलारिस की नकल करते हुए, मैन पेज कहता है)। किसी अन्य यूनिक्स AFAIK पर मौजूद नहीं।
गाइल्स

@ कर्टम - बीएसडी पर कोई बेहतर तरीका? pwdxवहाँ भी है ?
slm

9

यदि आपका सिस्टम है /proc, तो आप हमेशा ऐसा कर सकते हैं:

readlink -e /proc/$$/cwd

यदि आप CWD को एक अलग प्रक्रिया से जानना चाहते हैं, जिसमें आप रुचि रखते हैं, तो आपको स्पष्ट रूप $$से अपनी ब्याज की प्रक्रिया के PID से बदलना होगा ।


0

आधारित @ उत्तर उत्तर ..

यदि आप मैक ओएसएक्स और लिनक्स उपयोग के लिए अपनी प्रक्रिया की पीआईडी जानते हैं:

lsof -p PID | awk '$4=="cwd" {print $9}'

प्रक्रिया की काम कर पाने के लिए ..

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