python সহজ শেল=সত্যের সাথে প্রবর্তিত একটি পাইথন সাবপ্রোসেসটি কিভাবে শেষ করবেন




সহজ ভাষায় পাইথন ৩ pdf (8)

আমি নিম্নোক্ত কমান্ডটি দিয়ে একটি উপ-প্রসেস চালু করছি:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

যাইহোক, যখন আমি ব্যবহার করে হত্যা করার চেষ্টা করি:

p.terminate()

অথবা

p.kill()

কমান্ড ব্যাকগ্রাউন্ডে চলতে থাকে, তাই আমি অবাক হয়ে ভাবছিলাম কিভাবে আমি আসলে প্রক্রিয়াটি বন্ধ করতে পারি।

মনে রাখবেন যে যখন আমি কমান্ড চালাচ্ছি:

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)

এটি p.terminate() প্রদান করার সময় সফলভাবে সমাপ্ত হয়।


আপনি psutil ব্যবহার করতে পারেন, তাহলে এই পুরোপুরি কাজ করে:

import subprocess

import psutil


def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()


proc = subprocess.Popen(["infinite_app", "param"], shell=True)
try:
    proc.wait(timeout=3)
except subprocess.TimeoutExpired:
    kill(proc.pid)

দলের সব প্রসেস সংকেত পাঠান

    self.proc = Popen(commands, 
            stdout=PIPE, 
            stderr=STDOUT, 
            universal_newlines=True, 
            preexec_fn=os.setsid)

    os.killpg(os.getpgid(self.proc.pid), signal.SIGHUP)
    os.killpg(os.getpgid(self.proc.pid), signal.SIGTERM)

shell=True শেল শিশু প্রক্রিয়া, এবং কমান্ড তার সন্তান হয়। সুতরাং কোন SIGTERM বা SIGKILL শেলটি মেরে ফেলবে তবে তার সন্তানের প্রসেসগুলি নয়, এবং এটি করার জন্য আমার ভাল উপায় মনে নেই। shell=False ব্যবহার করার জন্য আমি মনে করতে পারি সর্বোত্তম উপায়, অন্যথায় যখন আপনি প্যারেন্ট শেল প্রক্রিয়াটি খুন করেন, এটি একটি নিষ্ক্রিয় শেল প্রক্রিয়া ছেড়ে চলে যাবে।


আমি কি মনে করতে পারি আমরা ব্যবহার করতে পারি:

import os
import signal
import subprocess
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

os.killpg(os.getpgid(pro.pid), signal.SIGINT)

এই সব আপনার টাস্ক কিন্তু পিপিআইডি সঙ্গে প্রক্রিয়া হত্যা করবে না


যেমন শাই বলেছিলেন, শেলটি শিশু, তাই সংকেতগুলি দ্বারা এটি আটকে যায় - শেল = মিথ্যা ব্যবহার করার জন্য সর্বোত্তম উপায় এবং কমান্ড লাইনটি বিভক্ত করার জন্য শ্লেক্স ব্যবহার করুন:

if isinstance(command, unicode):
    cmd = command.encode('utf8')
args = shlex.split(cmd)

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

তারপর p.kill () এবং p.terminate () কীভাবে আপনি আশা করেন তা কাজ করতে হবে।


আমি জানি এটি একটি পুরাতন প্রশ্ন কিন্তু এটি অন্য কোন পদ্ধতির জন্য অনুসন্ধান করতে পারে। আমি যা আহ্বান করেছি সেগুলি মেরে উইন্ডোতে ব্যবহার করি।

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.call(["taskkill", "/IM", "robocopy.exe", "/T", "/F"], startupinfo=si)

/ আইএম ইমেজ নাম, যদি আপনি চান / পিআইডি করতে পারেন। / টি প্রক্রিয়া পাশাপাশি শিশু প্রসেস হত্যা। / এফ বল এটি terminates। সি, আমি এটা সেট আছে, আপনি একটি সিএমডি উইন্ডো দেখানো ছাড়া এটি কিভাবে। এই কোড পাইথন 3 ব্যবহার করা হয়।


p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()

p.kill() শেল প্রক্রিয়াটি শেষ করে শেষ করে এবং cmd এখনও চলমান হয়।

আমি এই দ্বারা একটি সুবিধাজনক ফিক্স পাওয়া:

p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

এটি শেল প্রক্রিয়াকে শেল প্রসেসের উত্তরাধিকারী করে তুলবে, শেল চালু হওয়ার পরিবর্তে শিশু প্রক্রিয়াটি, যা মারা যায় না। p.pid আপনার p.pid প্রক্রিয়ার আইডি হবে।

p.kill() কাজ করা উচিত।

আমি জানি না এই পাইপের উপর কী প্রভাব পড়বে।


একটি গ্রুপ গ্রুপ ব্যবহার করুন যাতে গোষ্ঠীর সমস্ত প্রক্রিয়াতে একটি সংকেত প্রেরণ সক্ষম করা যায়। এর জন্য, আপনাকে একটি সেশন আইডি সংযুক্ত করা উচিত যা উদ্দীপ্ত / সন্তানের প্রসেসগুলির মূল প্রক্রিয়া, যা আপনার ক্ষেত্রে একটি শেল। এটি প্রক্রিয়াটির গোষ্ঠী নেতা করবে। তাই এখন, যখন একটি প্রক্রিয়া সংকেত পাঠকের কাছে পাঠানো হয়, তখন এটি এই গোষ্ঠীর সমস্ত শিশু প্রসেসে প্রেরণ করা হয়।

এখানে কোডটি রয়েছে:

import os
import signal
import subprocess

# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # Send the signal to all the process groups




kill-process