একটি চলমান প্রক্রিয়া বর্তমান চলমান ডিরেক্টরি খুঁজে?


167

চলমান প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) জানতে কোন আদেশ (গুলি) ব্যবহার করতে পারে? এগুলি হ'ল আদেশগুলি যা আপনি প্রক্রিয়া থেকে বাহ্যিকভাবে ব্যবহার করতে পারেন।

উত্তর:


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 দুর্দান্ত x
চককট্রিল

3
সমস্ত ইউনিট নেই /proc
পুনরায় পোস্টার

একটি অনুরূপ তবে পৃথক প্রশ্ন: unix.stackexchange.com/questions/173868/…
সিবস জুয়া

1
pwdxআমার জন্য কাজ কর.
আরথ

এখানে একটি সহজ উপায় (এসএমএল এর উত্তর থেকে) পিডাব্লুডএক্সpgrep <process-name>
মধুসূদন পি

27

আমি ধরে নিলাম আপনার প্রসেস আইডি রয়েছে pid। বেশিরভাগ সিস্টেমে বেশিরভাগ পদ্ধতির প্রয়োজন হয় যে আপনি যে শেলটিটি করছেন সেটি লক্ষ্য প্রক্রিয়া (বা মূল) হিসাবে একই ব্যবহারকারীর মতো চলছে।

লিনাক্স এবং সোলারিস এবং সম্ভবত কিছু অন্যান্য সিস্টেম ভি সংযুক্তিতে:

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

ওপেনবিএসডি-তে, কমপক্ষে, lsof কেবল প্রক্রিয়াটির সিডাব্লুডির মাউন্ট পয়েন্টের প্রতিবেদন করে।
কুর্তেম

@ এসএমএল pwdx20 ম শতাব্দী থেকে সোলারিসে উপস্থিত রয়েছে, লিনাক্স 2000-এর দশকের মাঝামাঝি থেকে (সোলারিসের অনুকরণ করে ম্যান পৃষ্ঠাটি বলেছেন)। অন্য কোনও ইউনিক্স এএফাইক-তে উপস্থিত নেই।
গিলস

@ কর্টম - বিএসডি-তে আরও ভাল কোন পদ্ধতি? এছাড়াও pwdxআছে?
slm

9

আপনার সিস্টেমে থাকলে /procআপনি সর্বদা এটি করতে পারেন:

readlink -e /proc/$$/cwd

আপনি যদি আগ্রহী তার থেকে আলাদা প্রক্রিয়া থেকে যদি আপনি সিডাব্লুডির সন্ধান করতে চান তবে আপনার আগ্রহের $$প্রক্রিয়াটির পিআইডি দিয়ে আপনাকে অবশ্যই প্রতিস্থাপন করতে হবে।


0

ভিত্তিক @ গিলস উত্তর ..

যদি আপনি আপনার প্রক্রিয়াটির পিআইডি জানেন .. ম্যাক ওএসএক্স এবং লিনাক্স ব্যবহারের জন্য:

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

প্রক্রিয়া dir পেতে ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.