ධාවනය වන ක්‍රියාවලියක ප්‍රතිදානය වෙනත් බැෂ් සැසියකදී දකින්නේ කෙසේද?


227

මම දේශීයව වැඩ කරමින් සිටියදී දුරස්ථ යන්ත්‍රයක ස්ක්‍රිප්ටයක් ධාවනය කර ඇත. මට එකම පරිශීලකයා ලෙස SSH හරහා යන්ත්‍රයට සම්බන්ධ වී ස්ක්‍රිප්ට් එක ක්‍රියාත්මක වන ආකාරය දැක ගත හැකිය ps.

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

එය හුදෙක් දේශීය සැසියක stdout වෙත ප්‍රතිදානය කරයි (මම ./ipchecker.shදේශීය පර්යන්ත කවුළුවක් සාදමි , නැවත හරවා යැවීමක් නැත, screenයනාදිය භාවිතා නොකරමි ).

SSH සැසියකින් කෙසේ හෝ මෙම ධාවන විධානයේ ප්‍රතිදානය මට දැක ගත හැකිද (එය නතර නොකර)?

මෙතෙක් මා සොයාගෙන ඇති හොඳම දේ භාවිතා කිරීම ය, strace -p 18386නමුත් තිරයේ ඉහළට පියාසර කරන පෙළක් මට ලැබෙනු ඇත. මට නැවැත්විය හැකි straceඅතර පසුව ප්‍රතිදානය හරහා ගොස් පා st ය stdout වෙත මුද්‍රණය කර ඇති නමුත් එය ඉතා දිගු හා ව්‍යාකූල වන අතර පැහැදිලිවම එය නැවැත්වූ විට මට යමක් මග හැරෙනු ඇත. මම දේශීයව වැඩ කරනවා සේ ස්ක්‍රිප්ට් ප්‍රතිදානය සජීවීව දැකීමට ක්‍රමයක් සොයා ගැනීමට මම කැමතියි.

මේ පිළිබඳව කිසිවෙකුට දියුණු විය හැකිද? පැහැදිලි පිළිතුර නම්, නැවත හරවා යැවීමකින් හෝ screenසැසියක දී පිටපත නැවත ආරම්භ කිරීමයි. මෙය මෙහෙවර විවේචනාත්මක පිටපතක් නොවේ, එබැවින් මට එය කළ හැකිය. ඒ වෙනුවට, මම මෙය විනෝදජනක ඉගෙනීමේ අභ්‍යාසයක් ලෙස දකිමි.


ඔබේ ක්‍රියාවලිය අථත්‍ය කොන්සෝලයක හෝ GUI / xterm වැනි පරිසරයක ක්‍රියාත්මක වේද?
ජිපී

4
ඔබට strace -p 4232 -e write
ස්ට්රේස්

ipp ජිපි යන්ත්‍රය සම්පූර්ණ GUI එකක් ක්‍රියාත්මක කරයි (ලිනක්ස් මයින්ට් 13, එක්ස්එෆ්සීඊ ඩෙස්ක්ටොප්), මම ග්නෝම් ටර්මිනලයක් වෙඩි තැබුවෙමි.
jwbensley

3
මෙම වෙබ් අඩවියේ අවම වශයෙන් සමාන ප්‍රශ්න දුසිමක්වත් තිබේ. සඳහා බලන්න reptyr මෙතන, එයින් කිහිපයක් (සහ පිළිතුරක්) සොයා ගැනීමට.
ස්ටෙෆාන් චසෙලාස්

Answers:


200

ඔබට කිරීමට අවශ්‍ය වන්නේ පවතින ක්‍රියාවලිය පිළිබඳ ඔත්තු බැලීම පමණි, ඔබට strace -p1234 -s9999 -e write1234 ක්‍රියාවලි හැඳුනුම්පත වන ස්ථානය භාවිතා කළ හැකිය . ( -s9999නූල් සහිත වැලකී සිටීමේ 32, චරිත හා ලොප් writeප්රතිදානය නිෂ්පාදනය කරන පද්ධතිය ඇමතුමක්.) ඔබ අදාල ගොනුව descriptor ලියා දත්ත පමණක් බැලීම සඳහා ඔබට අවශ්ය නම්, ඔබ වගේ දෙයක් භාවිතා කළ හැකිය strace -p1234 -e trace= -e write=3ගොනුව descriptor 3 ලියා පමණක් දත්ත බලන්න ( -e trace=තට්ටය පෑදීම පද්ධතිය ලොග් වීමෙන් ලැබෙන ඇමතුම්). එය දැනටමත් නිපදවා ඇති ප්‍රතිදානය ඔබට ලබා නොදේ.

ප්‍රතිදානය ඉතා වේගයෙන් අනුචලනය කරන්නේ නම්, ඔබට එය වැනි පේජරයකට නළා දැමිය හැකිය less, නැතහොත් එය ගොනුවකට යවන්න strace -o trace.log ….

බොහෝ වැඩසටහන් සමඟ, ඔබට පසු කාලීන ප්‍රතිදානය ptrace හැක් සමඟ ඔබේ වර්තමාන පර්යන්තයට හෝ නව තිර සැසියකට හරවා යැවිය හැකිය. බලන්න, මම ක්‍රියාත්මක වන ක්‍රියාවලිය ප්‍රතික්ෂේප කර එය නව තිර කවචයකට සම්බන්ධ කරන්නේ කෙසේද? සහ වෙනත් සම්බන්ධිත නූල්.

ඔබේ පද්ධතිය සකසා ඇති ආකාරය මත පදනම්ව, straceඅමතර වරප්‍රසාද නොමැතිව ඔබේ පරිශීලකයා යටතේ ක්‍රියාවලිය ක්‍රියාත්මක වුවද ඔබට මෙම සියලු විධානයන් root ලෙස ක්‍රියාත්මක කිරීමට අවශ්‍ය බව සලකන්න . (එම ක්රියාවලිය වෙනස් පරිශීලක ලෙස පවත්වාගෙන යෑමට හෝ setuid හෝ setgid වේ, ඔබ ක්රියාත්මක කිරීමට අවශ්ය වනු ඇත නම් strace. Root පරිශීලක ලෙස) බොහෝ බෙදාහැරීම් පමණක් ක්රියාවලිය එහි දරුවන් සොයා ගැනීමට ඉඩ (මෙම මධ්යස්ථ ආරක්ෂක ප්රතිලාභ - එය යම් ඍජු අනිෂ්ට මෘදුකාංග එන්නත් වළක්වයි නමුත් ගොනු වෙනස් කිරීමෙන් වක්‍ර එන්නත් කිරීම වළක්වන්නේ නැත). මෙය පාලනය කරනු ලබන්නේ kernel.yama.ptrace_scomesysctl විසිනි.


20
මම මේ ප්රතිදාන තෝරාගැනුමෙන් ඔබහට නැරඹුමෙහි පුළුල අඩු කර ගැනීමට ක්රමයක් තියෙනවා සිතමු නැහැ පමණක් සම්මත ප්රතිදානය ?
ජෝනා

3
ඔබට සියලු තර්ක පැහැදිලි කළ හැකිද?
පරිශීලක

6
මම නෝඩ්ජස් වෙතින් ලබා ගන්නා ප්‍රතිදානයේ විශාල බැක්ස්ලෑෂ් සහ සංඛ්‍යා රාශියක් තිබුණි; ඔවුන් කුමන කේතීකරණයේ සිටිය හැකිද? සරල පා text ද ඕනෑ තරම් තිබුණි, එය මට අවශ්‍ය විය.
ThorSummoner

4
"ඔබට සියලු තර්ක පැහැදිලි කළ හැකිද?" @ පරිශීලකයා:man strace
පිස්ටෝස්

4
AfRafaelMoni ඔබ ඉල්ලන දේ කිරීමේ වැඩසටහනක් නිදොස්කරණය කරන්නෙකු ලෙස හැඳින්වේ.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

167

procගොනු පද්ධතිය හරහා ඔබට ප්‍රතිදානයට ප්‍රවේශ විය හැකිය .

tail -f /proc/<pid>/fd/1

1= stdout, 2= stderr


8
එය මට ලබා දෙන්නේ: 'කියවීම සඳහා / proc / <my pid> / fd / 1 විවෘත කළ නොහැක: එවැනි උපාංගයක් හෝ ලිපිනයක් නොමැත'.
යාරොස්ලාව් නිකිටෙන්කෝ

21
ඔව් <my pid> ඔබේ ක්‍රියාවලි හැඳුනුම්පත
tvlooy

33
ප්‍රතිදානය tty එකකට යන්නේ නම් (හෝ වෙත හරවා යවනු ලැබේ /dev/null) මෙය ක්‍රියා නොකරනු ඇත - එය ක්‍රියාත්මක වන්නේ ප්‍රතිදානය ගොනුවකට හරවා යැවුවහොත් පමණි.
mattdm

1
උබුන්ටු 16.04 හි පරීක්ෂා කර ඇති අතර එය ක්‍රියා නොකරයි. සැසියකදී මම කරන්නෙමි: ping google.esතවත් එකක මූල ලෙස: tail -f /proc/`pgrep ping`/fd/2කිසිවක් පෙන්වන්නේ නැත.
david.perez

1
ඔයා හරි. Fd 1 සහ 2 යනු / dev / pts උපාංගයට සමමුහුර්ත වන බැවිනි. ඔබට -fa pts උපාංගය වලිගය කළ නොහැක. ඔබේ පිං විධානය ක්‍රොන්ජොබ් ලෙස උපලේඛනගත කර පසුව එය කරන්න. tail -f පසුව ක්‍රියා කරයි
tvlooy

11

BSD හි, ඔබට watchදී ඇති tty එකක් භාවිතා කළ හැකිය , උදා

watch /dev/pts/0

ලිනක්ස් දී, එය මෙම ක්රියාවලිය වැනි පෙර multiplexer යටතේ ක්රියාත්මක නොවේ නම්, හැකි වනු ඇත screenහෝ tmux. මෙයද බලන්න: Reptyr: නව පර්යන්තයකට ධාවන ක්‍රියාවලියක් අමුණන්න

එය එකම මාර්ගය ක්රියාවලිය (උදා: වැටීම් පෙනේ strace, dtrace/ dtruss, gdb, lldb, ආදිය).

straceකිසියම් අර්ථවත් ප්‍රතිදානයක් ලබා ගැනීම සඳහා ඔබ භාවිතා කර ඇති බැවින් , සුදුසුකම් ලත් ප්‍රකාශනයකින් පෙරීම කළ යුතුය (වැනි file), ඉන්පසු ප්‍රතිදානය විග්‍රහ කරන්න. මෙන්න උදාහරණය:

strace -e trace=write -s1000 -fp 18386 2>&1 | grep -o '".\+[^"]"'

එය කරන්නේ කුමක්ද යන්න PID මගින් නිශ්චිතව දක්වා ඇති ක්‍රියාවලියේ ලිවීමේ ක්‍රියාකාරිත්වය (දිග 1000) මුද්‍රණය කරයි ( pgrepඑය නමෙන් සොයා ගැනීමට භාවිතා කරන්න), සම්මත දෝෂය ප්‍රතිදානය වෙත හරවා යවයි (පෙරීමට) සහ ද්වි-උපුටා ගත් නූල මුද්‍රණය කරයි.

ඔබ ද්විමය ප්‍රතිදානය සමඟ කටයුතු කරන්නේ නම්, read(සමඟ -r) සහ printf (සමඟ %b) භාවිතා කිරීමෙන් ඔබට ගැලවීමේ අනුක්‍රමික අක්ෂර විග්‍රහ කළ හැකිය , උදා

while read -r -t1 line; do printf "%b" $line; done

help readතවත් පරාමිතීන් සඳහා පරීක්ෂා කරන්න (උදා: -nනව රේඛාවට වඩා නිශ්චිත අක්ෂර ප්‍රමාණයකින් පසුව මුද්‍රණය කිරීම).

මෙන්න වඩාත් සම්පූර්ණ උදාහරණය:

strace -e trace=write -s1000 -fp 18386 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

ඕනෑම ක්‍රියාවලියක් භාවිතා කරන උදාහරණ සඳහා, කරුණාකර පරීක්ෂා කරන්න: ෂෙල් එකේ ඇති ස්ට්‍රේස් සරල පෙළට විග්‍රහ කරන්නේ කෙසේද? stackoverflow හි


4
  1. ඔබගේ දුරස්ථ සේවාදායක පිවිසුම් අක්තපත්‍ර මගින් ප්‍රතිස්ථාපනය කළ යුතු ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scaleස්ථානය localhostසහ :0.0ඔබගේ GUI හි දර්ශන අංකය සමඟ දුරස්ථ තිරය දෙස බැලීමට ඔබට හැකිය .

  2. x11vncඔබගේ තිරයේ X- සැසිය සඳහා VNC සේවාදායකයක් වන භාවිතය .

  3. අතථ්‍ය කොන්සෝල 6 න් එකක් ක්‍රියාත්මක වන විට sudo setterm -dump 2 -file /dev/stdoutඔබ 2සුදුසු vc සමඟ ප්‍රතිස්ථාපනය කරන්න.


4

නම් කරන ලද පයිප්පයක් ( mkfifo) සාදා එම ගොනුවට ලිවීමට මම උපදෙස් දෙමි . ඉන්පසු එයින් කියවන්න. tailප්‍රතිදානය අවම කිරීම වැනි දේ සමඟ ඔබට සෑම විටම එය කළ හැකිය . ඔබ නළය ඉවත් කරන සෑම විටම (එයින් කියවන්න), එය නිෂ්කාශනය වේ, එවිට ප්‍රතිදානය සුරැකෙන්නේ නැත.

අනෙක් විකල්පය වනුයේ සෑම දෙයක්ම ගොනුවකට ලිවීමයි (ලොග් ෆයිල් එකක් වැනි) ඉන්පසු ඕනෑම වේලාවක එය විශ්ලේෂණය කරන්න. ඔබට සියලු ප්‍රතිදානයන් සුරැකීමට අවශ්‍ය නම් මෙය වඩාත් කැමති ක්‍රියාවකි.


3

ඔබට සෑම විටම nohup සහ & සමඟ ක්‍රියාවලියක් දියත් කළ හැකිය

nohup rsync source_file dest_file &

එවිට, ඔබට ඕනෑම tty එකකින් ප්‍රගතිය පරීක්ෂා කළ හැකිය:

tail -f nohup.out

මෙය මට හොඳින් ක්‍රියාත්මක වේ.


7
මෙම ප්‍රශ්නය ඔබේ පිළිතුරෙන් ඇඟවෙන පරිදි පසුබිමක ක්‍රියාවලියක් ක්‍රියාත්මක කරන්නේ කෙසේද යන්න ගැන නොව, අනතුරු ඇඟවීමේ ධාවන ක්‍රියාවලියක ප්‍රතිදානය දෙස බලන්නේ කෙසේද යන්න ගැන ය
jwbensley

ඇත්ත වශයෙන්ම, ඔබගේ: nohup සඳහන මා දැනුවත් කරන්න! ස්තූතියි!
Nam G VU

3

ස්ට්රේස් ප්රතිදානය විග්‍රහ කිරීම:

මම ඉහළම පිළිතුර භාවිතා කළෙමි (මගේ ක්‍රියාවලි හැඳුනුම්පත 28223 සමඟ) ...

> sudo strace -p28223 -s9999 -e write
...
write(9, "Info\nI\nCare\nabout", 55) = 55
...

මම සැලකිලිමත් බව තීරණය කිරීමට write(9. (9 පහත දැක්වේ, එය බොහෝ විට ගොනු හැසිරවීමක් විය හැකි අතර එය ඔබේ ක්‍රියාවලියට වෙනස් විය හැකිය.) ඉන්පසු මම ඒවා විග්‍රහ කර ප්‍රදර්ශනය කිරීම සඳහා ඉක්මන් රූබි පිටපතක් ලිව්වෙමි.

පහත සඳහන් දෑ අලවන්න /usr/bin/parse_strace.rb

#!/usr/bin/ruby

num = ARGV[0]
STDIN.each { |line|
  if (line.match(/write\(#{ num },\s*"(.*?)"/)) then
    puts $1.split('\x').map { |s| s.to_i(16).chr }.join()
  end
}

අමතක කරන්න එපා chmod a+x /usr/bin/parse_strace.rb

මම පළමු strace -xxආගන්තුකය සමඟ මගේ ස්ක්‍රිප්ටයට පයිප්ප (STDERR ද ඇතුළුව), (හෙක්ස් ප්‍රතිදානය කරයි, එබැවින් රීජෙක්ස් නිසි ලෙස ගැලපේ) 9.

sudo sh -c 'strace -xx -p28223 -s9999 -e write 2>&1 | parse_strace.rb 9'

වොයිලා, එය ක්‍රියාවලියේ මුල් STDOUT, නව රේඛා, වර්ණය සහ සියල්ල ප්‍රතිදානය කරයි!

STDOUT සැකසීමට අමුණා ඇත


1

ප්‍රතිදානය ලබා ගැනීම සඳහා ඉතා සරල වනුයේ ඔබේ ප්‍රතිදානය ගොනුවකට ග්‍රහණය කර එම ගොනුව ටයිල් කිරීමයි.

IF DO: ./ipcheck

INSTEAD DO: ./ipcheck> [replacewithyourfilename]

මෙය ඔබගේ ස්ක්‍රිප්ට් පිහිටා ඇති ප්‍රතිදාන ගොනුවක් නිර්මාණය කරයි. ඉන්පසු වෙනත් ඕනෑම බාෂ් කවචයකින් ඔබට ගොනුව වලිගය කළ හැකිය:

වලිගය [replacewithyourfilename] -f


ගොනු හරවා යැවීම පෙරනිමියෙන් බ්ලොක් මත පදනම් වූ බෆරින් භාවිතා කිරීමට නැඹුරු වේ (බලන්න setbuf(3)) එය tailගැටළු සහගත විය හැකිය .
thrig

5
එසේම මෙය දැනටමත් ක්‍රියාත්මක වන ක්‍රියාවලියක ප්‍රතිදානය දෙස බලන්නේ කෙසේද යන්න පිළිබඳ ප්‍රශ්නයට උපකාරී නොවේ, නව ක්‍රියාවලියක් සඳහා stdout හරවා යැවිය යුතු ආකාරය ගැන නොවේ.
jwbensley

0

ඔබට ක්‍රියාවලි හැඳුනුම්පත ලබාගෙන USR1 සමඟ සන්නිවේදනය කළ නොහැක,

$pgrep -l '^ipchecker.sh$'

එය ඔබගේ ස්ක්‍රිප්ටයේ PID මුද්‍රණය කරයි, පසුව එය භාවිතා කරන්න

$ kill -USR1 PID

USR1 යනු "පරිශීලක අර්ථ දක්වන ලද" සං signal ාවක් බව මට වැටහී ඇත, එයින් අදහස් කරන්නේ වැඩසටහන නිර්මාණය කළ ඕනෑම කෙනෙකුට එය "වසා දැමීම" හෝ "ඔබේ ල logs ු-සටහන් දමන්න" හෝ "දහස් වාරයක් මුද්‍රණය කරන්න" හෝ වෙනත් ඕනෑම දෙයක් භාවිතා කළ හැකි බවයි.

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.