নাম দিয়ে প্রক্রিয়া হত্যা?


100

আমি একটি প্রক্রিয়া (বিশেষত আইচ্যাট) হত্যার চেষ্টা করছি। কমান্ড লাইনে, আমি এই কমান্ডগুলি ব্যবহার করি:

ps -A | grep iChat 

তারপরে:

kill -9 PID

যাইহোক, আমি ঠিক জানি না কীভাবে এই কমান্ডগুলি পাইথনে অনুবাদ করা যায়।

উত্তর:


85

ধরে নিই যে আপনি ইউনিক্সের মতো প্ল্যাটফর্মে রয়েছেন (যাতে এটি ps -Aবিদ্যমান),

>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()

আপনাকে ভেরিয়েবলের ( ps -Aআউটপুট out) আউটপুট দেয় । আপনি এটিকে লাইনে বিভক্ত করতে পারেন এবং এগুলিতে লুপ করতে পারেন::

>>> for line in out.splitlines():
...   if 'iChat' in line:
...     pid = int(line.split(None, 1)[0])
...     os.kill(pid, signal.SIGKILL)
... 

(আপনি আমদানি এড়াতে signalএবং এর 9পরিবর্তে ব্যবহার করতে পারেন signal.SIGKILL, তবে আমি কেবল বিশেষভাবে এটি স্টাইল পছন্দ করি না, তাই আমি বরং নাম ধ্রুবকটি এইভাবে ব্যবহার করতাম)।

অবশ্যই আপনি এই লাইনে আরও পরিশীলিত প্রক্রিয়াজাতকরণ করতে পারেন, তবে এটি শেলটিতে আপনি যা করছেন তা নকল করে।

আপনি যা পরে এড়িয়ে চলেছেন psতা বিভিন্ন ইউনিক্স-মতো সিস্টেম জুড়ে করা শক্ত ( psএক অর্থে কোনও প্রক্রিয়া তালিকা পেতে তাদের সাধারণ এপিআই)। তবে যদি আপনার মনে একটি নির্দিষ্ট ইউনিক্সের মতো সিস্টেম থাকে তবে কেবল (কোনও ক্রস প্ল্যাটফর্মের বহনযোগ্যতার প্রয়োজন হয় না), এটি সম্ভব হতে পারে; বিশেষত, লিনাক্সে /procসিউডো-ফাইল সিস্টেম খুব সহায়ক। তবে এই শেষভাগটিতে আমরা সহায়তা করার আগে আপনাকে অবশ্যই আপনার সঠিক প্রয়োজনীয়তাগুলি পরিষ্কার করতে হবে।


4
যে খুব ভাল কাজ! আমি একটি ম্যাক পরিবেশ চালাচ্ছি তাই আমি মনে করি এটি নিখুঁত হবে। তোমার সকল সাহায্যের জন্য ধন্যবাদ.
হারুন

উপরে .nix এ কাজ করে তবে পাইথোনিক নয়। অনুমোদনের উপায়টি নীচে পোস্ট করা হিসাবে, ওএস.সিস্টেম ('টাস্কিল / এফ / আইএম مثالপ্রসেস.এক্সই') পদ্ধতির ব্যবহার করা যা মূল পাইথনের অংশ।
জোন্সোম পুনরায় ইনস্টল করুন মনিকা

@ জোনসোম: আপনার উত্তরটি উইন্ডোজের জন্য বলে মনে হয়েছে (কমান্ড সিনট্যাক্স এবং .exe ফাইলের কারণে) তবে প্রশ্নটি ম্যাক ওএসের জন্য বলে মনে হচ্ছে।
বাসুদেব রাম

আমি জিম্পাওলো রোডোলির এই উত্তরটি পছন্দ করি কারণ এটি খুব পাইথোনিক না হলেও এটি উইন্ডোজ ধরে ধরে কাজ করে যে আপনি সাইগউইন বা এমসিস ইনস্টল করেছেন have উইন্ডোজটিতে পাইথন ২.7.১০-তে সাউটিল উপস্থিত নেই। আমার মেশিনে "পাইপ ইনস্টল পিউজিল" চেষ্টা করা ব্যর্থ হয়েছে, এই বলে যে আমাকে ভিজ্যুয়াল সি ++ 9.0 ইনস্টল করা দরকার। স্ক্রু যে! আমি বরং অনেকটা সাইগউইন বা এমসিস ইনস্টল করতাম।
অ্যান্ড্রু বেনব্রিজ

পাইথন ৩.২ থেকে উইন্ডোজে কাজ করে তবে সাধারণত সিগন্যালটি হ'ল প্রক্রিয়াটির প্রস্থান কোড হবে।
সিস টিমারম্যান

208

Psutil নাম দ্বারা প্রক্রিয়া খুঁজে পেতে এবং এটি হত্যা করতে পারে:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()

52
এই. কারণ এটি ক্রস প্ল্যাটফর্ম
বেংট

4
বা আপনি যদি কমান্ড লাইনের মাধ্যমে এমন কিছু চান: যেমন: "আপনার_পিথন_সক্রিপট.পিপি" প্র্যাকসিএমডলাইনে: ..কিল
ওডব্লিউএল

11
এর খারাপ দিকটি হ'ল এটির জন্য psutilপ্যাকেজটি প্রয়োজন , এটি লক্ষ্য মেশিনে উপস্থিত নাও হতে পারে।
ক্যাডেন্ট অরেঞ্জ

4
@ বেঙ্গট আপনি যদি উইন্ডোজ অন্তর্ভুক্ত করেন তবে এটি ক্রস প্ল্যাটফর্ম নয় ! psutil পাইথন 2.7.10 এর অংশ নয়। এবং যদি আপনি ভিজ্যুয়াল সি ++ 9.0 ইনস্টল না করেন তবে "পিপ ইনস্টল স্যুইটিল" ব্যর্থ হয়, যা অনেক ক্ষেত্রেই ব্যবহারিক হবে না। তবুও, আপনার 17 টি আপগ্রেটে সংগ্রহগুলি :-)
অ্যান্ড্রু বেনব্রিজ

4
"পাইপ ইনস্টল সিউটিয়েল" ঠিকঠাকভাবে কাজ করবে কারণ এটি পাইপিতে হুইল সংস্করণটি পুনরুদ্ধার করবে। এবং না, আপনার একটি সংকলক লাগবে না।
জিম্পাওলো রোডোলো

35

ক্রস প্ল্যাটফর্ম হতে যদি আপনাকে উইন্ডোজ কেসটি বিবেচনা করতে হয়, তবে নিম্নলিখিতগুলি চেষ্টা করে দেখুন:

os.system('taskkill /f /im exampleProcess.exe')

@ অ্যালানসিকিরা27 দুর্ভাগ্যক্রমে এটি কেবল উইন্ডোজ সেন্টিমিডির ক্ষেত্রে। ক্রস প্ল্যাটফর্ম সমাধানের জন্য আপনাকে উপরের উত্তরগুলি দেখতে হবে।
লিমিচক্র্যাকার

এটি আমার ব্যবহারের ক্ষেত্রে কাজ করেছে। থ্যাঙ্কস! দ্রষ্টব্য, এটি ঝরঝরে, এটি সেই নামটি দিয়ে সমস্ত প্রক্রিয়াটিকে মেরে ফেলে তাই আপনার যদি একাধিক Y.exe সমাপ্ত হয় না, তবে এর সমস্ত প্রক্রিয়া আইডি সমাপ্ত হবে।
CommutativeAgegebra স্টুডেন্ট

22

কিলাল থাকলে:

os.system("killall -9 iChat");

বা:

os.system("ps -C iChat -o pid=|xargs kill -9")

9
এছাড়াও আছে pkill, যদিও আমি মনে করি আমি বিশ্বের একমাত্র ব্যক্তি যিনি এর পরিবর্তে এটি ব্যবহার করেনkillall
মাইকেল মরোজেক

4
ঠিক আছে, হ্যাঁ প্রথম কমান্ডটি নিখুঁতভাবে কাজ করেছে বলে মনে হচ্ছে। সাহায্যের জন্য ধন্যবাদ.
হারুন

4
@ মিশেলমরোজেক আপনি কীভাবে টাইপের মতো মিষ্টি অনুভূতি নিয়ে বেঁচে থাকতে পারেন killall java?
অ্যালোস মাহডাল

@ মিশেল আমি ব্যবহার করি pkillকারণ killallআমি কেবলমাত্র "সমস্ত কিছুর হত্যার" বিষয় সম্পর্কে অবগত ছিলাম aware
কাইল স্ট্র্যান্ড 18

6

এটি উইন্ডোজ 7 এ আমার জন্য কাজ করেছিল

import subprocess
subprocess.call("taskkill /IM geckodriver.exe")

4

আপনি এটি চেষ্টা করতে পারেন। তবে এর আগে আপনাকে ব্যবহার করে psutil ইনস্টল করতে হবেsudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()

অন্ততপক্ষে এটি বহনযোগ্য, এমনকি যদি গৃহীত উত্তর ইতিমধ্যে এই সমাধানটির বর্ণনা দেয়।
জিন-ফ্রানসোয়া ফ্যাব্রে

1

নীচের কোডটি সমস্ত আইচ্যাট ওরিয়েন্টেড প্রোগ্রামগুলিকে হত্যা করবে:

p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE)
out, err = p.communicate()

for line in out.splitlines():        
    line = bytes.decode(line)
    pid = int(line.split(None, 1)[0])
    os.kill(pid, signal.SIGKILL)

1

ব্যবহার করে প্রক্রিয়া অবজেক্টটি পান Process

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>> 

0

pkill <process_name>নাম অনুসারে প্রক্রিয়া কিল করতে আপনি ইউনিক্স সিস্টেমে ব্যবহার করতে পারেন ।

তারপরে অজগর কোডটি হবে:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)

আমি যে সমস্ত সিস্টেমগুলি ব্যবহার করছি তা হ'ল ম্যাক এবং আমি যখন পিকিল চালানোর চেষ্টা করি তখন কেবল আমাকেই বলা হয় যে কমান্ডটি পাওয়া যাবে না।
অ্যারন

0

আপনি উইন্ডোতে এটি করতে ডাব্লুএমআই মডিউলটি ব্যবহার করতে পারেন, যদিও এটি ইউনিক্সের লোকেরা আপনার ব্যবহারের চেয়ে অনেক বেশি ক্লঙ্কিয়ার; import WMIপ্রক্রিয়াটি পেতে দীর্ঘ সময় লাগে এবং মধ্যবর্তী ব্যথা হয় pain


0

আপনি যদি কোনও বিশেষ শিরোনাম (গুলি) বহন করে প্রক্রিয়া (এস) বা সেমিডি.এক্সই মারতে চান।

import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]

# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
    for title in titles:
        if  title in line['Window Title']:
           print line['Window Title']       
           PIDList.append(line['PID'])

# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
    os.system('taskkill /pid ' + id ) 

আশা করি এটা সাহায্য করবে. তাদের আমার জন্য আরও ভাল সমাধান হতে পারে।


0

অ্যালেক্স মার্টেলির উত্তর পাইথন 3 এ কাজ করবে না কারণ outএটি একটি বাইট অবজেক্ট হবে এবং ফলস্বরূপ TypeError: a bytes-like object is required, not 'str'যখন এটি পরীক্ষা করবে if 'iChat' in line:

সাবপ্রসেস ডকুমেন্টেশন থেকে উদ্ধৃতি :

যোগাযোগ () একটি টিপল দেয় (stdout_data, stderr_data)। পাঠ্য মোডে স্ট্রিমগুলি খোলা থাকলে ডেটা স্ট্রিং হবে; অন্যথায়, বাইট।

পাইথন 3 এর জন্য, এটি নির্মাণকারীর সাথে text=True(> = পাইথন 3.7) বা universal_newlines=Trueযুক্তি যুক্ত করে সমাধান করা হবে Popenoutতারপরে স্ট্রিং অবজেক্ট হিসাবে ফিরে আসবে।

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()

for line in out.splitlines():
    if 'iChat' in line:
        pid = int(line.split(None, 1)[0])    
        os.kill(pid, signal.SIGKILL)

বিকল্পভাবে, আপনি বাইটগুলির ডিকোড () পদ্ধতিটি ব্যবহার করে একটি স্ট্রিং তৈরি করতে পারেন।

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()

for line in out.splitlines():
    if 'iChat' in line.decode('utf-8'):
        pid = int(line.split(None, 1)[0])    
        os.kill(pid, signal.SIGKILL)

-1

আমার জন্য একমাত্র কাজটি ছিল:

উদাহরণ স্বরূপ

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()


-2
import psutil
pid_list=psutil.get_pid_list()
print pid_list
p = psutil.Process(1052)
print p.name
for i in pid_list:
    p = psutil.Process(i)
    p_name=p.name
    print str(i)+" "+str(p.name)
    if p_name=="PerfExp.exe":
        print "*"*20+" mam ho "+"*"*20
        p.kill()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.