किलॉल मुझे देता है `कोई प्रक्रिया नहीं मिली` लेकिन पीएस


17

क्या कोई मुझे killऔर के बीच का अंतर समझा सकता है killall? क्यों नहीं दिखाता है killallक्या psदिखाता है?

# ps aux |grep db2
root      1123  0.0  0.8 841300 33956 pts/1    Sl   11:48   0:00 db2wdog                                         
db2inst1  1125  0.0  3.5 2879496 143616 pts/1  Sl   11:48   0:02 db2sysc                                        
root      1126  0.0  0.6 579156 27840 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1127  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1128  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd 

# killall db2ckpwd
db2ckpwd: no process found

# kill -9 1126
# kill -9 1127
# kill -9 1128

सिस्टम SuSe 11.3 (64 बिट) है; कर्नेल 2.6.34-12; वर्जन 3.2.8; PSmisc से हत्या 22.7; ग्नू कोरूटिल्स 7.1 से मार


SIGKILL (-9) के साथ प्रक्रियाओं को कभी न मारें।
वॉनब्रांड

जब एक प्रक्रिया को समाप्त करने की आवश्यकता होती है तब क्या करना है?
राडेक

यह बहुत, बहुत अंतिम उपाय है।
वॉनब्रांड

जवाबों:


19

क्या यह लिनक्स पर है?

कि द्वारा उपयोग किया जाता कमांड नाम की वास्तव में कुछ आसानी से अलग संस्करण हैं ps, killallआदि

दो मुख्य वेरिएंट हैं: 1) लंबी कमांड का नाम, जो आपको चलाने पर मिलता है ps u; और 2) शॉर्ट कमांड नाम, जो आपको psबिना किसी झंडे के चलाने पर मिलता है ।

संभवतः सबसे बड़ा अंतर तब होता है जब आपका प्रोग्राम एक शेल स्क्रिप्ट या कुछ भी होता है जिसमें एक दुभाषिया की आवश्यकता होती है, जैसे पायथन, जावा, आदि।

यहाँ वास्तव में एक तुच्छ लिपि है जो अंतर प्रदर्शित करती है। मैंने इसे फोन किया mycat:

#!/bin/sh
cat

इसे चलाने के बाद, यहाँ दो अलग-अलग प्रकार के हैं ps

सबसे पहले, बिना u:

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat

दूसरी बात, साथ u:

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat

ध्यान दें कि दूसरा संस्करण कैसे शुरू होता है /bin/sh?

अब, जहाँ तक मैं बता सकता हूँ, killallवास्तव में पढ़ता है /proc/<pid>/stat, और कमांड नाम के रूप में पार्न्स के बीच में दूसरा शब्द पकड़ लेता है, इसलिए जब आप चलते हैं तो वास्तव में आपको निर्दिष्ट करने की आवश्यकता होती है killall। तार्किक रूप से, यह वैसा ही होना चाहिए जैसा कि झंडा psबिना uकहता है, लेकिन यह जांचना एक अच्छा विचार होगा।

जाँच करने के लिए चीजें:

  1. cat /proc/<pid>/statकमांड का नाम क्या है?
  2. ps -e | grep db2कमांड का नाम क्या है?
  3. क्या करें ps -e | grep db2और ps au | grep db2एक ही कमांड नाम दिखाएं?

टिप्पणियाँ

यदि आप अन्य पीएस झंडे का भी उपयोग कर रहे हैं, तो आपको ps -o commसंक्षिप्त नाम ps -o cmdदेखने के लिए और लंबे नाम को देखने के लिए उपयोग करना सरल हो सकता है ।

आपको pkillएक बेहतर विकल्प भी मिल सकता है । विशेष रूप से, pkill -fपूर्ण कमांड नाम का उपयोग करके मेल करने की कोशिश करता है, अर्थात द्वारा मुद्रित ps uया के रूप में कमांड नाम ps -o cmd


बहुत अच्छी व्याख्या। और मुझे लगता है कि आप पहली बार सही थे। ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` और ps aux | grep db2 मुझे देता है root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd। उस पर टिप्पणी कर सकते हैं। मैं थोड़ा खोया हुआ हूं।
राडेक

मुझे यकीन नहीं है। यह संभव है कि कार्यक्रम अपना नाम बदल रहा है। क्या आप जानते हैं कि इसे कैसे चलाया जा रहा है? क्या ls -l /proc/3084/exeकहता है? क्या बारे में whichया whenceया typeफ़ाइल खोजने के लिए और उसके बाद के लिए lsऔर typeअगर यह एक सिमलिंक या स्क्रिप्ट या एक द्विआधारी है देखने के लिए?
मिकेल

ls -l / proc / 3084 / exe हमें देता हैlrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr मुझे देता है-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek

प्रकार मुझे / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

6

किलॉल एक प्रक्रिया नाम पर मेल करने की कोशिश करता है (लेकिन वास्तव में मिलान वाले हिस्से में यह अच्छा नहीं है)।

और जब से "ps | grep" और "ps | grep | किल" बहुत बेहतर काम करता है, किसी ने इसे सरल बनाया और pgrep और pkill बनाया। "Ps grep" और "ps किल" जैसी आज्ञाओं को पढ़ें, क्योंकि यह कमांड पहले ps तो grep और यदि वांछित है तो मारता है।


2

मुझे एक समान समस्या थी लेकिन /proc/<pid>/statइसमें अपेक्षित स्ट्रिंग शामिल थी। स्ट्रेस का उपयोग करके मैं देख सकता था कि हत्यारे भी पहुंच गए थे /proc/<pid>/cmdline

मैंने यह पता लगाने के लिए gdb का उपयोग करना जारी रखा कि मेरे मामले में यह मेरे कमांड के एक चेक पर पूरी कमांड में विफल हो गया था जिसमें सभी आर्ग्स पाए गए थे /proc/<pid>/cmdline। ऐसा लग रहा था कि कोडनाम का पथ 15 वर्णों से अधिक लंबा होने के कारण ट्रिगर हो गया था (जो कि हत्यारे के स्रोत में एक हार्डकोड मूल्य है)। मैं पूरी तरह से जांच नहीं करता था कि मैं किसी तरह इसे हत्यारे के साथ काम करने के लिए प्राप्त कर सकता हूं।

लेकिन जैसा कि अन्य टिप्पणियों में उल्लेख किया गया है कि pkill एक बेहतर विकल्प है जिसमें समान मुद्दे नहीं हैं।

रुचि के लिए https://github.com/acg/psmisc के स्रोत कोड pkillयहां देखे जा सकते हैं ।


0

उबंटू 16 सिस्टम पर / proc / pid / stat में थ्रेड का नाम होगा (जो कि प्रोग्राम pthread_setname_np सिस्टम कॉल के माध्यम से हो सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.