שאלה משתני סביבה של תהליך ריצה ב- Unix?


אני צריך לפתור כמה בעיות הקשורות משתני סביבה על מערכת יוניקס.

ב- Windows, אני יכול להשתמש בכלי כגון ProcessExplorer כדי לבחור תהליך מסוים ולהציג ערכים של כל משתנה סביבה.

כיצד אוכל להשיג את אותו הדבר ב- Unix? echoing ו env cmd רק להציג ערכים בזמן הנוכחי, אבל אני רוצה לראות אילו ערכים את תהליך הריצה הוא משתמש כרגע.


203
2017-09-17 18:14




למרות / proc / <pid> / environ יש גודל של 0, עדיין יש מידע שם. "זה הגיוני יותר אם אתה חושב על זה בתור חלון לתוך הקרנל, הקובץ אינו מכיל למעשה נתונים כלשהם, הוא פשוט משמש מצביע למקום שבו מידע התהליך בפועל". [מקור] - nevets1219


תשובות:


cat /proc/<pid>/environ

אם אתה רוצה להיות pid (s) של הפעלה מסוימת ההפעלה אתה יכול, בין מספר אפשרויות אחרות, להשתמש pidofYou

AlberT$ pidof sshd   
30690 6512 

עריכהYou

אני לגמרי ציטוט @ תגובה Teddy להשיג פלט קריא יותר:

xargs --null --max-args=1 < /proc/<pid>/environ

262
2017-09-17 18:18



כדי להפוך אותו לקריא, להמיר את nulls ל newlines: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
אני תמיד עושה xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
מחרוזות שימוש טובות יותר, הצום שלה. החתול עדיין מהיר יותר :-) - Nikhil Mulley
הכל /proc מערכת הקבצים אינה ניידת. - Daniel H
אני לא מבין למה להשתמש xargs כדי להמיר nulls ל newlines עדיף להשתמש tr. האם מישהו יכול להניח את זה בשבילי? תודה. - Jonathan Hartley


מאז שאלה זו יש יוניקס תג וכל השאר עשה כזה עבודה נהדרת פונה לינוקס תג, אתה יכול לקבל מידע זה על OS X ומערכות אחרות נגזר BSD באמצעות

ps -p <PID> -wwwe

או

ps -p <PID> -wwwE

ועל סולאריס עם

/usr/ucb/ps -wwwe <PID>

Solaris תומכת גם ב /proc אם אתה לא רוצה לזכור את מעורפל ps .


52
2017-09-17 20:47



אני רץ ps-p <PID> -Www על OS X 10.6 אני מקבל את רשימת כל התהליכים הפועלים. הפקודה הנכונה היא -E דגל, לא. - drAlberT
בדקתי על OS X 10.4, אבל לא 10.5. עודכן בהתאם. - Gerald Combs
זה לא מושלם. האפשרות -E מדווחת בלבד התחלתי משתני סביבה. אם המשתנים שונו על ידי תהליך הריצה עצמו (למשל באמצעות השימוש בפונקציה POSIX putenv), השינויים אינם משתקפים בתפוקה של ps -p <PID> -wwE. - Kal
לא לראות את vars של תהליכים שאינם בבעלות לך נשמע כמו תכונה רצויה. זה גם המקרה של @ drAlberT של לינוקס מוכווני התשובה באמצעות /proc/PID/environ. קבצים אלה ניתנים לקריאה רק על ידי הבעלים של התהליך. - Jonathan Hartley
@yani זה אפשרי, אבל זה הרבה יותר קשה, זה דורש לצרף הבאגים לתהליך ריצה. ראה תשובה זו: unix.stackexchange.com/a/70636 - Kal


כפי שאחרים הזכירו, על לינוקס, אתה יכול להסתכל / proc אבל יש, בהתאם לגרסת הליבה שלך, אחד או שניים גבולות:

קודם כל, קובץ הסביבה מכיל את הסביבה כפי שהיא נראתה כאשר התהליך הוליד. כלומר, כל שינוי שהתהליך עשוי היה לבצע לסביבתו לא יהיה גלוי ב- / proc:

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

הקונכייה הראשונה היא פגז כניסה ובתחילה יש סביבה מוגבלת מאוד, אבל היא גדלה על ידי המקור למשל. .bashrc אבל / proc אינו משקף זאת. הקליפה השנייה יורשת את הסביבה הגדולה יותר מההתחלה, מה שהיא מראה את זה ב / proc.

כמו כן, בגרעינים ישנים יותר, התוכן של קובץ ה- environ מוגבל לגודל עמוד (4K):

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

איפשהו בין 2.6.9 (RHEL4) ו 2.6.18 (RHEL5) מגבלה זו הוסרה ...


24
2017-10-29 11:27



האם ניתן לקבל את המשתנים הסביבתיים של תהליך מרוחק שנקבעו לאחר תהליך הוליד? אני מבין את זה על VFS, הוא הראה עם / proc / self / environ אבל רק אם אנחנו בתוך התהליך. אבל איך להשיג את זה עבור תהליך מרוחק? - GP92


שימוש נכון של אפשרויות BSD לעשות זאת (לפחות על לינוקס):

ps e $pid

או

ps auxe  #for all processes

וכן, manpage PS הוא די מבלבל. (דרך)


10
2018-03-04 12:15



האובונטו שלי מנפץ את משתני הסביבה ממש מול שורת הפקודה, אפילו לא כמו רווח ביניהם, וגם קטעים לשורה אחת על חלון הטרמינל. מצאתי ps eww $pid מתקן את הבעיה השנייה. - user18911
@ user18911: VV env יש מפריד תו ריק. תשובות אחרות בדף זה מציגות דרכים לשימוש xargs או tr כדי להמיר אלה ל newlines עבור readability. אתה בטח הבנתי את זה בארבע השנים האחרונות. - Jonathan Hartley


cat /proc/PID/environ

החלף את ה- PID עם ה- PID של התהליך שברצונך לראות. כל מידע על תהליך ריצה נמצא תחת / proc / PID / directory

לדוגמה: cat / proc / 32512 / environ


7
2017-09-17 18:19





תחת לינוקס, הייתי מנסה להסתכל על

/proc/<pid>/environ

6
2017-09-17 18:19





נלקח מתוך ויקימילוןYou

ניתן ליצור פונקציה זמנית כדי לנתח את הערכים ב /proc/<pid>/environ. בהנחיית המסוף:

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

לאחר מכן עם pid של התהליך שאתה רוצה, פשוט להשתמש:

envof <pid>

6
2018-01-13 23:05