යුනික්ස් හි ක්‍රියාත්මක වන ක්‍රියාවලියක පාරිසරික විචල්‍යයන්?


238

යුනික්ස් පද්ධතියක පරිසර විචල්‍යයන් හා සම්බන්ධ ගැටළු නිරාකරණය කිරීමට මට අවශ්‍යය.

වින්ඩෝස් හි, මට විශේෂිත ක්‍රියාවලියක් තෝරා ගැනීමට සහ එක් එක් පරිසර විචල්‍යයේ අගයන් බැලීමට ProcessExplorer වැනි මෙවලමක් භාවිතා කළ හැකිය.

යුනික්ස් හි එකම දේ ඉටු කරන්නේ කෙසේද? echoingසහ envcmd වර්තමානයේදී අගයන් පෙන්වයි, නමුත් දැනට ක්‍රියාත්මක වන ක්‍රියාවලිය භාවිතා කරන්නේ කුමන අගයන් දැයි බැලීමට මට අවශ්‍යය.


2
/ Proc / <pid> / පරිසරයේ ප්‍රමාණය 0 ක් වුවද, එහි තවමත් තොරතුරු තිබේ. "ඔබ එය කර්නලය තුළට කවුළුවක් ලෙස සිතන්නේ නම් එය වඩාත් අර්ථවත් කරයි. ගොනුවේ ඇත්ත වශයෙන්ම කිසිදු දත්තයක් අඩංගු නොවේ; එය සත්‍ය ක්‍රියාදාම තොරතුරු පවතින ස්ථානයට දර්ශකයක් ලෙස ක්‍රියා කරයි." [මූලාශ්‍රය ]
nevets1219

Answers:


306
cat /proc/<pid>/environ

ලබා දී ඇති ක්‍රියාත්මක කළ හැකි pid (ය) ඔබට අවශ්‍ය නම්, වෙනත් හැකියාවන් ගණනාවක් අතර, භාවිතා කළ හැකිය pidof:

AlberT$ pidof sshd   
30690 6512 

සංස්කරණය කරන්න :

වඩාත් කියවිය හැකි ප්‍රති .ලයක් ලබා ගැනීම සඳහා මම ඩෙනිස් විලියම්සන් සහ ටෙඩිගේ අදහස් මුළුමනින්ම උපුටා දක්වමි . මගේ විසඳුම පහත දැක්වේ:

tr '\0' '\n' < /proc/<pid>/environ

48
එය කියවිය හැකි වන පරිදි, ශුන්‍යයන් නව රේඛාවලට පරිවර්තනය කරන්න:cat /proc/17330/environ | tr \\0 \\n
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

33
මම නිතරම කරනවාxargs --null --max-args=1 echo < /proc/PID/environ
ටෙඩි

7
වඩා හොඳ නූල් භාවිතා කරන්න, එහි වේගවත්. බළලා තවමත් වේගවත් :-)
නිඛිල් මුලි

3
මුළු /procගොනු පද්ධතියම අතේ ගෙන යා නොහැක.
ඩැනියෙල් එච්

6
xargsශුන්‍යයන් නව රේඛාවලට පරිවර්තනය කිරීම භාවිතා කිරීමට වඩා හොඳ වන්නේ මන්දැයි මට තේරෙන්නේ නැත tr. යමෙකුට එය මා වෙනුවෙන් තැබිය හැකිද? ස්තූතියි.
ජොනතන් හාර්ට්ලි

63

මෙම ප්‍රශ්නයට යුනික්ස් ටැගයක් ඇති අතර අනෙක් සියල්ලන්ම ලිනක්ස් ටැගය ඇමතීම සඳහා එතරම් විශාල කාර්යයක් කර ඇති හෙයින් , ඔබට මෙම තොරතුරු OS X සහ වෙනත් BSD- ව්‍යුත්පන්න පද්ධති භාවිතයෙන් ලබා ගත හැකිය.

ps -p <PID> -wwwe

හෝ

ps -p <PID> -wwwE

සහ සොලාරිස් සමඟ

/usr/ucb/ps -wwwe <PID>

/procඅපැහැදිලි psවිධාන මතක තබා ගැනීමට ඔබට අවශ්‍ය නැතිනම් සොලාරිස් නාමාවලියට සහය දක්වයි .


4
II OS X 10.6 මත ps -p <PID> -wwwe ධාවනය කරන්න සියලු ධාවන ක්‍රියාවලි ලැයිස්තුව මට ලැබේ. නිවැරදි විධානය -E ධජය සමඟ මිස -e නොවේ.
drAlberT

1
මම OS X 10.4 මත පරීක්ෂා කළ නමුත් 10.5 නොවේ. ඒ අනුව යාවත්කාලීන කරන ලදි.
ජෙරල්ඩ් පනා

4
මෙය පරිපූර්ණ නොවේ. -E විකල්පය වාර්තා කරන්නේ ආරම්භක පරිසර විචල්‍යයන් පමණි. ධාවන ක්‍රියාවලිය විසින්ම විචල්‍යයන් වෙනස් කර ඇත්නම් (උදා: POSIX putenv () ශ්‍රිතය භාවිතා කිරීමෙන්), වෙනස්කම් ප්‍රතිදානයේ පිළිබිඹු නොවේ ps -p <PID> -wwE.
කල්

1
ඔබට අයත් නොවන ක්‍රියාවලීන් දැක නොගැනීම ප්‍රියමනාප ලක්ෂණයකි. @ DrAlberT හි ලිනක්ස්-නැඹුරු පිළිතුර භාවිතා කිරීම සඳහා ද එය එසේමය /proc/PID/environ. එම ලිපිගොනු කියවිය හැක්කේ ක්‍රියාවලියේ හිමිකරුට පමණි.
ජොනතන් හාර්ට්ලි

1
@yani එය කළ හැකි නමුත් එය වඩා දුෂ්කර ය, එය ක්‍රියාත්මක කිරීමේ ක්‍රියාවලියට නිදොස්කරණය කරන්නෙකු ඇමිණීම අවශ්‍ය වේ. මෙම පිළිතුර බලන්න: unix.stackexchange.com/a/70636
කල්

25

අනෙක් අය සඳහන් කර ඇති පරිදි, ලිනක්ස් හි ඔබට / proc දෙස බැලිය හැකි නමුත් ඔබේ කර්නල් අනුවාදය අනුව සීමාවන් එකක් හෝ දෙකක් තිබේ:

පළමුවෙන්ම, පරිසර ගොනුවේ පරිසරය අඩංගු වන්නේ ක්‍රියාවලිය ආරම්භ වූ විට බැලූ බැල්මට ය. එයින් අදහස් වන්නේ ක්‍රියාවලිය එහි පරිසරයට සිදු කර ඇති ඕනෑම වෙනස්කමක් / proc හි නොපෙනෙන බවයි:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

පළමු කවචය පිවිසුම් කවචයක් වන අතර මුලදී ඉතා සීමිත පරිසරයක් ඇති නමුත් එය මූලාශ්‍ර මගින් වර්ධනය කරයි .බෑෂ්ර්ක් නමුත් / proc මෙය පිළිබිඹු නොකරයි. දෙවන කවචය ආරම්භයේ සිටම විශාල පරිසරය උරුම කර ගනී, එම නිසා එය / proc හි පෙන්වයි.

පැරණි කර්නල් වල, පරිසර ගොනුවේ අන්තර්ගතය පිටු ප්‍රමාණයකට (4K) සීමා වේ:

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

2.6.9 (RHEL4) සහ 2.6.18 (RHEL5) අතර කොහේ හරි මෙම සීමාව ඉවත් කරන ලදි ...


1
ක්‍රියාවලිය ආරම්භ වූ පසු සකස් කරන ලද දුරස්ථ ක්‍රියාවලියක පාරිසරික විචල්‍යයන් ලබා ගත හැකිද? VFS හි එය / proc / self / පරිසරය සමඟ පෙන්වන බව මට වැටහී ඇති නමුත් අප ක්‍රියාවලිය තුළ සිටින්නේ නම් පමණි. නමුත් දුරස්ථ ක්‍රියාවලියක් සඳහා මෙය ලබා ගන්නේ කෙසේද?
GP92

11

මෙය සිදු කිරීම සඳහා BSD විකල්ප නිවැරදිව භාවිතා කිරීම (අවම වශයෙන් ලිනක්ස් මත):

ps e $pid

හෝ

ps auxe  #for all processes

ඔව්, ps manpage ඉතා අවුල් සහගතය. ( හරහා )


මගේ උබුන්ටු පරිසර විචල්‍යයන් විධාන රේඛාවට එරෙහිව බිඳ දමයි, ඒවා අතර එතරම් ඉඩක් නොමැතිව, ටර්මිනල් කවුළුවේ එක් පේළියකට කපා දමයි. ps eww $pid2 වන ගැටලුව විසඳන බව මට පෙනී ගියේය.
user18911

1
@ user18911: env vars හි ශුන්‍ය අක්ෂර බෙදුම්කරු ඇත. මෙම පිටුවේ වෙනත් පිළිතුරු භාවිතා කිරීමට මාර්ග පෙන්වීමට xargsහෝ trකියවීමේ පහසුව සඳහා හිස් පේලි ගැන මේ බවට පරිවර්තනය කිරීමට. ඔබ මෙය වසර හතරක කාලය තුළ තේරුම් ගෙන ඇති.
ජොනතන් හාර්ට්ලි

7
cat /proc/PID/environ

ඔබට දැකීමට අවශ්‍ය ක්‍රියාවලියේ PID සමඟ PID ආදේශ කරන්න. ක්‍රියාත්මක වන ක්‍රියාවලියක් පිළිබඳ සෑම තොරතුරක්ම / proc / PID / නාමාවලිය යටතේ ඇත

උදාහරණය: cat / proc / 32512 / පරිසරය


7

Archlinux wiki වෙතින් ලබා ගත් :

අගයන් විග්‍රහ කිරීම සඳහා ඔබට තාවකාලික ශ්‍රිතයක් නිර්මාණය කළ හැකිය /proc/<pid>/environ. පර්යන්ත විමසුමේදී:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

ඔබට අවශ්‍ය ක්‍රියාවලියේ පිඩ සමඟ, භාවිතා කරන්න:

envof <pid>

7

තරමක් විරල ලෙස ලේඛනගත කර ඇති නමුත්, අන්තර්ගතයේ අන්තර්ගතය /proc/<pid>/environඅඩංගු වන්නේ ක්‍රියාවලිය ආරම්භ කිරීම සඳහා භාවිතා කළ පරිසරය පමණි.

ක්‍රියාවලි පරිසරයක වත්මන් තත්වය පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම්, එය කළ හැකි එක් ක්‍රමයක් වන්නේ භාවිතා gdbකිරීමයි.

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end

1
එම විධානයන් ද, quitඅවසානයේ දී විධානයක් .gdbගොනුවකට දැමීමෙන් ද වඩා හොඳ විය හැකිය ~/penv.gdb; gdb(1)ක්‍රියාවලියක පරිසරය පරීක්ෂා කිරීමට අවශ්‍ය ඕනෑම වේලාවක මෙම GDB ස්ක්‍රිප්ට් එකෙන් ආරම්භ gdb -x ~/penv.gdb -p <pid> [<exe-file>]වේ.
අඩු බලය

6

ලිනක්ස් යටතේ, මම බැලීමට උත්සාහ කරමි

/proc/<pid>/environ


4

මගේ රැකියාව මාව AIX රසික පිරිමි ළමයෙකු බවට පත් කරන බැවින්, අපි අමතක නොකරමු:

ps eww [pid]

නැතහොත් මෑන් පිටුව එය හඳුන්වන පරිදි, "බර්ක්ලි ප්‍රමිති".

කුමන හේතුවක් නිසා හෝ / proc / PID / පරිසරය AIX හි නොපවතී.


3

envඅත්තනෝමතික ක්‍රියාවලියක් (PID) සඳහා පරිසර විචල්‍යයන්ගේ ප්‍රතිදානය වැනි ආකෘති නිර්මාණය කිරීමට ඔබට අවශ්‍ය නම් , ඔබට පහසු බාෂ් penv <pid>විධානයක් (ඔබේ මෙහෙයුම් පද්ධතියට ගැලපෙන පරිදි) නිර්මාණය කර එය ඔබගේ .bashrc:

ලිනක්ස් මෙය ඔබගේ ~ / .bashrc වෙත එක් කරන්න:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD මෙය ඔබගේ ~ / .bashrc වෙත එක් කරන්න:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

සොලාරිස් මෙය ඔබගේ ~ / .bashrc වෙත එක් කරන්න:

penv() {
   pargs -e $1
}

භාවිතය:

$ source $ HOME / .bashrc
$ pgrep VBoxSVC
10268
$ penv 10268
SSH_CONNECTION = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = sl = 49; 39: cx = 49; 39: mt = 49; 38; 5; 167; 1: fn = 49; 39; 1: ln = 49; 39: bn = 49; 39: se = 50; 39
LANG = en_US.UTF-8
EDITOR = vim
XDG_SESSION_ID = 106
USER = මූල
PWD = / root
HOME = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
TERM = xterm-256color
SHELL = / bin / bash
SHLVL = 1
LOGNAME = මූල
DBUS_SESSION_BUS_ADDRESS = unix: path = / run / user / 0 / bus
XDG_RUNTIME_DIR = / ධාවනය / පරිශීලක / 0
PATH = / root / bin: / bin: / sbin: / usr / bin: / usr / sbin: / usr / local / bin: / usr / local / sbin :.
VBOX_LOG_FLAGS = නූල් tsc
VBOX_LOG = -ඇම + dev_vmm_backdoor.elf + dev_vmm.elf

0

මැක් විසඳුමක්, බොහෝ විට වෙනත් බීඑස්ඩී ද ඒ හා සමාන විය හැකිය

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

පරිසර විචල්‍යයන් විධාන රේඛාවට එකතු කර ඇති අතර, මෙය විධාන රේඛාව ඉවත් කරන අතර අපට ඉතිරිව ඇත්තේ පරිසර විචල්‍යයන් පමණි.

එය පරිපූර්ණ නොවේ, මන්ද ඒවා අවකාශය වෙන් කොට එල්එෆ් වෙන් නොකෙරේ


-1

/ proc / PID / පරිසරය

මේ සඳහා, පළමුව අපි ක්‍රියාවලියේ PID හඳුනාගත යුතුය. මේ සඳහා ඔබට ps විධානය භාවිතා කළ හැකිය

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.