ක්‍රියාත්මක වන ක්‍රියාවලියක වත්මන් වැඩ නාමාවලිය සොයා ගන්න?


186

ක්‍රියාත්මක වන ක්‍රියාවලියක වර්තමාන ක්‍රියාකාරී නාමාවලිය (සීඩබ්ලිව්ඩී) සොයා ගැනීමට කෙනෙකුට භාවිතා කළ හැකි විධානය කුමක්ද? මේවා ඔබට ක්‍රියාවලියෙන් බාහිරව භාවිතා කළ හැකි විධාන වේ.

Answers:


245

මා දන්නා ක්‍රම 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
මම කියන්නේ / proc කැනොනිකල් ය, එය ප්‍රයෝජනවත් වන නමුත් pwdx සිසිල් ය.
චක්කොට්රිල්

3
සියලුම යුනිසෙස් සතුව නැත /proc.
රිනියර්පොස්ට්

සමාන නමුත් වෙනස් ප්‍රශ්නයක්: unix.stackexchange.com/questions/173868/…
සිබ්ස් සූදුව

1
pwdxමට වැඩ කරයි.
aroth

මෙන්න සරල ක්‍රමයක් (slm ගේ පිළිතුරෙන්) pwdxpgrep <process-name>
මධුසුදන් පී

28

ක්‍රියාවලි හැඳුනුම්පත ඔබ සතුව ඇතැයි මම සිතමි pid. බොහෝ පද්ධතිවල බොහෝ ක්‍රම සඳහා ඔබ මෙය කරන කවචය ඉලක්ක ක්‍රියාවලියට (හෝ මූලයට) සමාන පරිශීලකයෙකු ලෙස ක්‍රියාත්මක වීම අවශ්‍ය වේ.

ලිනක්ස් සහ සොලාරිස් සහ සමහර විට වෙනත් පද්ධති V යුනිසස් මත:

cd /proc/$pid/cwd && pwd

ලිනක්ස් මත ( readlinkලබා ගත නොහැකි කාවැද්දූ පද්ධති හැර ) නමුත් සොලාරිස් නොවේ:

readlink /proc/$pid/cwd

ඕනෑම යුනික්ස් ප්‍රභේදයක් මත, ඔබට භාවිතා කළ හැකිය lsof. නව රේඛාවක් තිබේ නම් එය මුද්‍රණය කරනු ඇති බවට පරෙස්සම් වන්න \n(පසුපෙළෙන් වෙන් කොට හඳුනාගත නොහැකි n). ඔබට වාසනාවන්ත යැයි හැඟේ නම්, ඔබට දෙවන පෝරමය භාවිතා කළ හැකිය, එය නාමාවලි නාමයේ ඇති සියලුම හිස් අවකාශය නිහ ly ව යටපත් කරයි.

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 වාර්තා කරන්නේ ක්‍රියාවලියේ සීඩබ්ලිව්ඩී සවිකිරීමේ ස්ථානය පමණි.
kurtm

pwdx20 වන ශතවර්ෂයේ සිට සොලාරිස්, 2000 දශකයේ මැද භාගයේ සිට ලිනක්ස් ( එස්එල්එම් ) පවතී (සොලාරිස් අනුකරණය කරමින් මෑන් පිටුව පවසයි). වෙනත් යුනික්ස් AFAIK හි නොමැත.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

urkurtm - BSD හි වඩා හොඳ ක්‍රමයක් තිබේද? එසේම pwdxතිබේද?
slm

9

ඔබේ පද්ධතියට තිබේ නම් /proc, ඔබට සැමවිටම කළ හැකිය:

readlink -e /proc/$$/cwd

ඔබ උනන්දුවක් දක්වන ක්‍රියාවලියට වඩා වෙනස් ක්‍රියාවලියකින් සීඩබ්ලිව්ඩී සොයා ගැනීමට ඔබට අවශ්‍ය නම්, ඔබ පැහැදිලිවම $$ඔබේ රුචිකත්වයේ PID සමඟ ආදේශ කළ යුතුය.


0

පදනම් කරගත් @ ගිලෙස් පිළිතුර ..

ඔබගේ ක්‍රියාවලියේ PID ඔබ දන්නේ නම් .. මැක් ඕඑස්එක්ස් සහ ලිනක්ස් භාවිතය සඳහා:

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

ක්‍රියාවලි වැඩ කිරීමට ..


lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing Output information may be incomplete.වෙන කාටහරි මේක ලැබෙනවාද?
ශ්‍රීධර් සර්නොබත්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.