मैं अपने यूआईडी का उपयोग करके उपयोगकर्ता की सभी प्रक्रियाओं को कैसे मार सकता हूं


41

मैं किसी विशेष उपयोगकर्ता की सभी चल रही प्रक्रियाओं को या तो शेल स्क्रिप्ट या लिनक्स सिस्टम पर मूल कोड से मारना चाहता हूं।

क्या मुझे / proc निर्देशिका को पढ़ना है और इनको देखना है?

कोई विचार? क्या लिनक्स में यूआईडी के तहत पिड्स का डायनेमिक मैपिंग है? क्या यह प्रोक में नहीं है?

यदि नहीं, तो यह सूची कहाँ रखी गई है? क्या मुझे इससे पढ़ना चाहिए? यह भी है कि सिस्टम में सभी यूआईडी की स्थिर सूची कहां है, इसलिए मैं इस उपयोगकर्ता को मान्य कर सकता हूं और फिर इसके साथ चलने वाली सभी प्रक्रियाओं को मारने के लिए आगे बढ़ें?


6
क्या आप ऐसा करने के लिए एक उपकरण चाहते हैं (pkill, slay, others are), या क्या आप इसे स्वयं लिखना चाहते हैं? यदि पूर्व, सुपरसुअर स्टैक एक्सचेंज साइट शायद बेहतर है। यदि बाद वाला, स्कैनिंग / खरीद और एक विशिष्ट उपयोगकर्ता द्वारा सभी प्रक्रियाओं के लिए एक नोट बना रहा है तो जाने का रास्ता है। उदाहरण के लिए, pkill उपयोगिता के लिए स्रोत कोड, यह दिखाएगा कि यह कैसे करना है।

क्या आप स्पष्ट कर सकते हैं कि यह सवाल @ लार्सविरेनियस की टिप्पणी के आलोक में क्या था? धन्यवाद!
कालेब

@ कालेब: मैं / को पढ़कर प्रक्रियाओं को मारना चाहता था क्योंकि मुझे ऐसा करने वाले किसी उपकरण का पता नहीं था। इसके अलावा अब मुझे लगता है कि मेरे सिस्टम पर "किल", "पीकिल", "कौशल" आदि के अलावा अन्य उपलब्ध नहीं हैं। उस स्थिति में, मुझे लगता है कि मुझे शेल स्क्रिप्ट के विकल्पों को देखना है / पढ़ना है और एक उपयोगकर्ता के तहत प्रक्रियाओं को प्राप्त करने का तरीका पता लगाना है। कोई विचार?
user489152

1
"सभी यूआईडी की स्थैतिक सूची ... के बारे में ... तो मैं इस उपयोगकर्ता को मान्य कर सकता हूं"।: उपयोगकर्ता आईडी को मान्य करने जैसी कोई बात नहीं है। उपयोगकर्ता नाम एक डेटाबेस से आते हैं, लेकिन उपयोगकर्ता आईडी जो भी प्रक्रिया चल रही है setuid()चुनता है।
गिल्स एसओ- बुराई पर रोक '17

जवाबों:


52

यूआईडी के बजाय उपयोग pkill -U UIDया pkill -u UIDउपयोगकर्ता नाम। कभी-कभी skill -u USERNAMEकाम हो सकता है, एक और उपकरण है killall -u USERNAME

कौशल एक linux-specific था और अब पुराना हो चुका है , और pkill अधिक पोर्टेबल (Linux, Solaris, BSD) है।

pkill प्रभावी और वास्तविक http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... नाम और अन्य विशेषताओं के आधार पर संकेत प्रक्रियाएं

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

मैन ऑफ़ स्किल का कहना है कि इसे केवल उपयोगकर्ता नाम का उपयोग करने की अनुमति है, न कि यूजर आईडी: http://man7.org/linux/man-pages/man1/skill.1.html

कौशल, टुकड़ा ... ये उपकरण अप्रचलित और अप्राप्य हैं। कमांड सिंटैक्स को खराब तरीके से परिभाषित किया गया है। किलल्ल, पकिल का उपयोग करने पर विचार करें

  -u, --user user
         The next expression is a username.

किलॉल को लिनक्स में आउटडेटेड के रूप में चिह्नित नहीं किया गया है, लेकिन यह संख्यागत यूआईडी के साथ भी काम नहीं करेगा; केवल उपयोगकर्ता नाम: http://man7.org/linux/man-pages/man1/killall.1.html

किलॉल - नाम से मार प्रक्रियाओं

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

मुझे लगता है, लिनक्स / सोलारिस शैली / प्रोक्योर (प्रूफ़्स) में प्रक्रिया खोजने के लिए उपयोग की जाने वाली कोई भी उपयोगिता प्रक्रियाओं की पूरी सूची का उपयोग करेगी (कुछ रीडिर करने की /proc)। मुझे लगता है, वे /procडिजिटल सबफ़ोल्डर्स पर पुनरावृत्ति करेंगे और मैच के लिए हर मिली प्रक्रिया की जाँच करेंगे ।

उपयोगकर्ताओं की सूची प्राप्त करने के लिए, इसका उपयोग करें getpwent(इसे प्रति कॉल एक उपयोगकर्ता मिलेगा)।

कौशल (procps और procps-NG) और killall (psmisc) उपकरण दोनों का उपयोग करता है getpwnamके पार्स तर्क को पुस्तकालय कॉल -uविकल्प है, और केवल उपयोगकर्ता नाम पार्स किया जाएगा। pkill(procps और procps-ng) atol और getpwnam दोनों का उपयोग parse -u/ -Uतर्क के लिए करता है और दोनों संख्यात्मक और पाठ्य सामग्री विनिर्देशक की अनुमति देता है।


1
pkill अप्रचलित नहीं है। यह लिनक्स के बाहर अप्राप्य हो सकता है, लेकिन यह सवाल विशेष रूप से लिनक्स के बारे में था।

1
उपयोगकर्ताओं की सूची पाने के लिए एक लाइनर का उपयोग करें: getent passwd | awk -F: '{प्रिंट $ 1}'
पेटेश

मैं किस बारे में कमांड देता हूं जैसे: C सिस्टम से "किल-जू यूआईडी" () कॉल?

1
क्या यह एक एम्बेडेड लिनक्स है? आपके पास कोई कौशल, pkill और किलॉल नहीं है? यहां तक ​​कि बिजीबॉक्स एम्बेडेड शेल में pkill और Killall है।
ऑगक्स

2
killall -u USERNAMEआकर्षण की तरह काम किया
michalzuber

8

यदि आप killशेल कमांड या killसी फ़ंक्शन में प्रक्रिया आईडी तर्क के रूप में -1 पास करते हैं , तो सिग्नल को उन सभी प्रक्रियाओं तक भेजा जाता है, जो उस तक पहुंच सकती हैं, जिसका अर्थ है killकमांड या syscall चलाने वाले उपयोगकर्ता की सभी प्रक्रियाएं ।

su -c 'kill -TERM -1' bob

सी में (त्रुटि जाँच छोड़ा गया):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

यदि pkill फ़ंक्शन आपके UNIX / Linux वितरण पर अनुपलब्ध है, तो आप रूट कमांड को रूट उपयोगकर्ता के रूप में चला सकते हैं:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

उपयोगकर्ता नाम जहां उपयोगकर्ता है, जिसकी प्रक्रिया आप हटाना चाहते हैं


या बस pkill -U username
ओएसजीएक्स


0

इसने मेरे लिए अच्छा काम किया है। आप कर सकते हैं उपयोगकर्ता नाम ps U <username>और वहाँ से जाने से प्रक्रियाओं के सभी पिड । इसे इस्तेमाल करे:

ps U <username> | cut -d " " -f 1 | xargs kill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.