<ක්‍රියා විරහිත> ක්‍රියාවලියක් යනු කුමක්ද, එය මරණයට පත් නොවන්නේ ඇයි?


201

ක්‍රෝම් බ්‍රව්සරය ප්‍රතිචාර <defunct>නොදැක්වූ අතර මම එය kill ාතනය කිරීමට උත්සාහ කළෙමි, නමුත් අතුරුදහන් වීම වෙනුවට ක්‍රියාවලිය එහි දකුණු පැත්තේ තිබූ අතර මරණයට පත් නොවීය:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

<defunct>ක්‍රියාවලියක් යනු කුමක්ද සහ එය මරණයට පත් නොවන්නේ ඇයි?


3
පිළිගත් පිළිතුරෙහි " kill -9 PIDවැඩ නොකරන්න" යනුවෙන් සඳහන් වේ. එය අර්ධ වශයෙන් සත්‍යයකි: යථාර්ථය නම්, කිසිදු kill ාතනයක් සිදු නොවනු ඇත. ඊට අමතරව, -9 අවසාන පියවරක් ලෙස භාවිතා කළ යුතුය. දෙමව්පියන්ගේ ක්‍රියාවලිය සුපුරුදු ලෙස kill ාතනය කිරීමෙන් 99% ක්ම එය මරා දමා සියලු දරුවන් නෙළා ගනු ඇත. “පෙරනිමි kill ාතනය” යනු SIGTERM (-15) ය. -9 (SIGKILL) හි රසිකයින්ට stackoverflow.com/questions/690415/…
මයික් එස්

Answers:


197

ඔබගේ නිමැවුමෙන් අපට "අක්‍රිය" බවක් පෙනේ, එයින් අදහස් වන්නේ ක්‍රියාවලිය එහි කර්තව්‍යය සම්පූර්ණ කර හෝ දූෂිත හෝ මරා දමා ඇති බවයි, නමුත් එහි ළමා ක්‍රියාදාමයන් තවමත් ක්‍රියාත්මක වෙමින් පවතී හෝ මෙම දෙමාපිය ක්‍රියාවලිය එහි ළමා ක්‍රියාවලිය අධීක්ෂණය කරයි. මේ ආකාරයේ ක්‍රියාවලියක් kill ාතනය කිරීමට, -9 PID kill ාතනය නොකරයි. මෙම විධානය මඟින් ඔබට ඔවුන්ව kill ාතනය කිරීමට උත්සාහ කළ හැකි නමුත් එය මෙය නැවත නැවතත් පෙන්වනු ඇත.

මෙම අක්‍රිය ක්‍රියාවලියේ මව් ක්‍රියාවලිය කුමක්දැයි තීරණය කර එය මරා දමන්න. මෙය දැන ගැනීම සඳහා විධානය ක්‍රියාත්මක කරන්න:

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

එවිට kill -9 637 27872, එම අභාවයට ගොස් ක්රියාවලිය විසින් පිට වී ගොස් ඇත තහවුරු ps -ef | grep defunct.


14
ඔබට "අක්‍රීය" ක්‍රියාවලිය විනාශ කළ නොහැක. ඔබට එය කළ හැක්කේ ක්‍රියාවලි වගුවක එහි මකාදැමීම මකා දැමීමෙන් පමණි.
jfs

66
පිපිඩ් 1( init) නම් කුමක් කළ යුතුද ? මට බලා සිටීමට සිදුවනු ඇතැයි සිතමු?
ලූක්

9
kill ාතනය ස්වයංක්‍රීය කිරීමට, ඔබට මෙයද කළ හැකිය (ප්‍රතිදානයෙන් ඔබ කපන බයිට් වෙනස් කිරීමට අවශ්‍ය විය හැක):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
වොරන්

3
ස්තූතියි. දෙවන වර්‍ගය නොකිරීමෙන් ඔබට එය තරමක් කෙටි හා (ඉමෝ) සරල කළ හැකිය. පළමු ග්‍රෙප් එක grep [d]efunctහෝ ඊට සමාන ලෙස වෙනස් කරන්න , එය එයට නොගැලපේ.
Thor84no

5
සිග්කිල් එකකින් වුවද අක්‍රීය ක්‍රියාවලියක් මරා දැමිය නොහැක. තව දුරටත්, ඔබ kill -9 ලස්සන ලෙස විචක්ෂණ ලෙස භාවිතා කරයි. Stackoverflow.com/questions/690415/… බලන්න . අක්‍රීය දරුවන් kill ාතනය කිරීමට ඔබට අවශ්‍ය නම්, ඔබට උත්සාහ කළ හැකිය : parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill. තත්පර 30 ක් හෝ ඊට පසුව ස්ක්‍රිප්ට් එක නැවත ක්‍රියාත්මක කරන්න, kill -9ඔබට අවශ්‍ය නම්. (මම killing ාතනය කිරීම විශේෂයෙන් තහනම් කර ඇති බව සලකන්න Init)
මයික් එස්

64

අත්පොත පිටුව ps (1) මෙසේ පවසයි :

සලකුණු කරන ලද <defunct>ක්‍රියාදාමයන් මළ ක්‍රියාදාමයන් වේ (ඊනියා "පිල්ලි" ) ඔවුන්ගේ මවුපියන් නිසි ලෙස විනාශ කර නැති නිසා ඉතිරිව පවතී. init(8)මව් ක්‍රියාවලිය පිටව ගියහොත් මෙම ක්‍රියාවලීන් විනාශ වේ.

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

යුනික්ස් සහ යුනික්ස් වැනි පරිගණක මෙහෙයුම් පද්ධති වල, පිල්ලියක් ක්‍රියාවලියක් හෝ අක්‍රිය ක්‍රියාවලියක් යනු ක්‍රියාත්මක කිරීම සම්පූර්ණ කළ ක්‍රියාවලියක් වන නමුත් තවමත් ක්‍රියාවලි වගුවේ ඇතුළත් කර ඇත. දෙමව්පියන්ගේ ක්‍රියාවලියට එහි දරුවාගේ පිටවීමේ තත්ත්වය කියවීමට ඉඩ දීම සඳහා මෙම ප්‍රවේශය තවමත් අවශ්‍ය වේ.

ඒවායින් බොහොමයක් නොමැති නම් එවැනි ක්‍රියාදාමයන්ට ඉඩ දීමෙන් කිසිදු හානියක් නොමැත. සොම්බි අවසානයේ අස්වැන්න නෙළා ගන්නේ එහි මවුපියන් විසිනි (ඇමතීමෙන් wait(2)). මුල් දෙමව්පියන් තමන්ගේ පිටවීමට පෙර එය නෙලා නොගත්තේ නම්, initක්‍රියාවලිය ( pid == 1) පසුකාලීනව එය කරයි. සොම්බි ක්‍රියාවලිය සාධාරණයි:

ක්‍රියාවලිය අවසන් වී ඇති අතර එම ක්‍රියාවලිය අවසන් වන තෙක් බලා සිටින වෙනත් ක්‍රියාවලියකට එහි පිටවීමේ තත්ත්වය වාර්තා වූ විට එය මකා දමනු ලැබේ.


1
"ඒවායින් බොහොමයක් නොමැති නම් එවැනි ක්‍රියාදාමයන්ට ඉඩ දීමෙන් කිසිදු හානියක් නොමැත". මෙය සත්‍ය නොවේ. මෙම අක්‍රිය ක්‍රියාවලීන්ට තවමත් ගොනු හැසිරවීම් විවෘතව තබා ගත හැකිය (නිදසුනක් ලෙස ලිපිගොනු අගුළු දමන්න), සහ වරාය විවෘතව පවතී. සමහර විට මට කිව හැකි තාක් දුරට පද්ධති නැවත පණගැන්වීමකින් තොරව මෙම ක්‍රියාවලීන් සුරැකීමක් නොමැත.
ස්කොට්

1
C ස්කොට්: මළ ක්‍රියාවලියක් ගොනු හැසිරවීම් විවෘතව තබන්නේ ඇයි කියා ඔබ සිතන්නේ ඇයි? ඔබට ඩොක්ස් වෙත සබැඳියක් තිබේද, එවැනි හැසිරීමක් පෙන්නුම් කරන පිටපතක්ද?
jfs

අවාසනාවකට එය සිදුවී ඇති බව මා දුටු බවට එහා කිසිදු සාක්ෂියක් මා සතුව නොමැති අතර, ඊළඟ වතාවේ එක් ක්‍රියාවලියක් නැවත අවවාදයට ලක්වනු ඇතැයි මම නොදනිමි. ඉතා මෑතකදී මම ගොනුවක් මත "lsof" භාවිතා කර එය අක්‍රිය ක්‍රියාවලියක් ලෙසම විවෘත කර ඇති බව තහවුරු කර ගතිමි. මීට පෙර මම (නෙට්ස්ටැට් / එල්සොෆ් භාවිතා කරමින්) මගේ අක්‍රිය ක්‍රියාවලිය තවමත් විවෘතව සවන් දෙමින් සිටි වරාය රඳවාගෙන සිටින බව දුටුවෙමි. මෙය මගේ init.d ස්ක්‍රිප්ට් වල ආරක්‍ෂාව ගොඩනගා ඇති ගැටළුවක් වන අතර නැවත ආරම්භ කිරීමේදී අක්‍රීය ක්‍රියාවලිය ඉවත් වන තෙක් බලා සිටිනු ඇත. එවිට නව ක්‍රියාවලියට වරාය බැඳ තැබිය හැකිය. මම තරවටු කළහොත් තිර පිටපතක් ලැබෙනු ඇත
ස්කොට්

1
C ස්කොට්: ඔබ සඳහන් කළ ගැටළු පිල්ලියක් වීම හා බැඳී ඇති බවක් නොපෙනේ. මිය ගිය ක්‍රියාවලියක් ගොනු හැසිරවීම් විවෘතව තබා ගැනීම ගැන මම පුදුම වෙමි. සනාථ නොකළ නොමඟ යවන ප්‍රකාශ වලින් වැළකී
සිටිමු

අක්‍රීය ක්‍රියාදාමයන් වරාය සහ ලිපිගොනු විවෘතව තබා ඇති බව ඔබ පිළිගන්නේ නැත්නම්, එය හොඳයි, නමුත් මගේ තර්කය සනාථ කළ නොහැකි හෝ නොමඟ යවන සුළු නොවේ. එය ආනුභවික සාක්ෂි මගින් සනාථ කෙරෙන අතර මා එය පැවසීමට මුල්ම හේතුව වූයේ පිළිතුර කියවන අය නොමඟ නොයැවීම සහතික කිරීමයි. තවත් පර්යේෂණ කිහිපයක් කිරීමෙන්, අවම වශයෙන් වරාය සඳහා, සොකට් විවෘතව පැවතිය හැකි බව පෙනේ, ක්‍රියාවලිය තාක්‍ෂණිකව මිය ගියද. එබැවින් පරිශීලකයාගේ අවසාන ප්‍රති result ලය සමාන වේ, වරාය විවෘතව පවතී. superuser.com/questions/1196736/…
ස්කොට්

3

පැඩිංටන්ගේ පිළිතුර පුළුල් කරමින් ..

ඔබගේ නිමැවුමෙන් අපට අක්‍රීය බවක් පෙනේ , එයින් අදහස් වන්නේ මෙම ළමා ක්‍රියාවලිය එහි කාර්යය සම්පූර්ණ කර හෝ දූෂිත හෝ මරා දමා ඇති බවයි. එහි මව් ක්‍රියාවලිය තවමත් ක්‍රියාත්මක වන අතර එහි මියගිය දරුවා දැක නැත.

kill -9 PID වැඩ කරන්නේ නැත (දැනටමත් මිය ගොස් ඇත).

මෙම ළමා ක්‍රියාවලියේ මවුපියන් තීරණය කිරීම සඳහා, මෙම විධානය ක්‍රියාත්මක කරන්න:

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>

දෙමව්පියන් කවුදැයි බලන්න: ps ax | grep 27872

ඔබට අවශ්‍ය නම් ඔබට මවුපියන් මරා දැමිය හැකිය. kill -9 27872

වඩාත් තාක්ෂණික තර්කනය සඳහා ජේ. එෆ්. සෙබස්තියන්ගේ පිළිතුර බලන්න.


2

@ පැඩිංටන්ගේ පිළිතුරට එකතු කරමින්, ඉක්මන් පරීක්ෂා කිරීම සඳහා මම මෙම කාර්යය මගේ bashrc වෙත එක් කළෙමි:

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

එය මෙවැනි දෙයක් ප්‍රතිදානය කරයි:

ළමුන්:
UID PID PPID C STIME TTY TIME CMD
පරිශීලක 25707 25697 0 පෙබ 26 pts / 0 00:00:00 [sh] 
පරිශීලක 30381 29915 0 11:46 pts / 7 00:00:00 grep අක්‍රීයයි
------------------------------
දෙමාපියන්:
25697 pts / 0 00:00:00 npm

1

ස්තූතියි මයික් එස්. අපි ඔබේ රේඛාව ගෙන පිටපතක් ලිව්වා, එහි දෙමව්පියන් in.telnetd හි අක්‍රිය ක්‍රියාවලීන් විනාශ කරයි. කිසිදු මව් ක්‍රියාවලියක් kill ාතනය කිරීම අපට අවශ්‍ය නොවීය, ගැටලුවක් ඇති වන බව අප දන්නා අතර අවශ්‍ය නම් බහුවිධයන් kill ාතනය කිරීම සඳහා අපි එය කිහිප වතාවක් ක්‍රියාත්මක කරන්නෙමු.

# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.

first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"

# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
        echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
        echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
        kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
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.