আমি একটি প্রক্রিয়া (বিশেষত আইচ্যাট) হত্যার চেষ্টা করছি। কমান্ড লাইনে, আমি এই কমান্ডগুলি ব্যবহার করি:
ps -A | grep iChat
তারপরে:
kill -9 PID
যাইহোক, আমি ঠিক জানি না কীভাবে এই কমান্ডগুলি পাইথনে অনুবাদ করা যায়।
উত্তর:
ধরে নিই যে আপনি ইউনিক্সের মতো প্ল্যাটফর্মে রয়েছেন (যাতে এটি 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
সিউডো-ফাইল সিস্টেম খুব সহায়ক। তবে এই শেষভাগটিতে আমরা সহায়তা করার আগে আপনাকে অবশ্যই আপনার সঠিক প্রয়োজনীয়তাগুলি পরিষ্কার করতে হবে।
Psutil নাম দ্বারা প্রক্রিয়া খুঁজে পেতে এবং এটি হত্যা করতে পারে:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
প্যাকেজটি প্রয়োজন , এটি লক্ষ্য মেশিনে উপস্থিত নাও হতে পারে।
ক্রস প্ল্যাটফর্ম হতে যদি আপনাকে উইন্ডোজ কেসটি বিবেচনা করতে হয়, তবে নিম্নলিখিতগুলি চেষ্টা করে দেখুন:
os.system('taskkill /f /im exampleProcess.exe')
কিলাল থাকলে:
os.system("killall -9 iChat");
বা:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, যদিও আমি মনে করি আমি বিশ্বের একমাত্র ব্যক্তি যিনি এর পরিবর্তে এটি ব্যবহার করেনkillall
killall java
?
pkill
কারণ killall
আমি কেবলমাত্র "সমস্ত কিছুর হত্যার" বিষয় সম্পর্কে অবগত ছিলাম aware
আপনি এটি চেষ্টা করতে পারেন। তবে এর আগে আপনাকে ব্যবহার করে psutil ইনস্টল করতে হবেsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
pkill <process_name>
নাম অনুসারে প্রক্রিয়া কিল করতে আপনি ইউনিক্স সিস্টেমে ব্যবহার করতে পারেন ।
তারপরে অজগর কোডটি হবে:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
আপনি উইন্ডোতে এটি করতে ডাব্লুএমআই মডিউলটি ব্যবহার করতে পারেন, যদিও এটি ইউনিক্সের লোকেরা আপনার ব্যবহারের চেয়ে অনেক বেশি ক্লঙ্কিয়ার; import WMI
প্রক্রিয়াটি পেতে দীর্ঘ সময় লাগে এবং মধ্যবর্তী ব্যথা হয় pain
আপনি যদি কোনও বিশেষ শিরোনাম (গুলি) বহন করে প্রক্রিয়া (এস) বা সেমিডি.এক্সই মারতে চান।
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 )
আশা করি এটা সাহায্য করবে. তাদের আমার জন্য আরও ভাল সমাধান হতে পারে।
অ্যালেক্স মার্টেলির উত্তর পাইথন 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
যুক্তি যুক্ত করে সমাধান করা হবে Popen
। out
তারপরে স্ট্রিং অবজেক্ট হিসাবে ফিরে আসবে।
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)
আমার জন্য একমাত্র কাজটি ছিল:
উদাহরণ স্বরূপ
import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
import os, signal
def check_kill_process(pstring):
for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
fields = line.split()
pid = fields[0]
os.kill(int(pid), signal.SIGKILL)