Python Subprocess Yardım !

import subprocess
import time
from multiprocessing import Process
import os

def Run():
    
    proc = subprocess.Popen(’ping www.google.com -c 20’.split(), stdout=subprocess.PIPE)
    output ,err = proc.communicate()
    print proc.pid
    
if __name__ == "__main__":

    p = Process(target=Run)
    p.start()
    
    print "Attack was started"
    time.sleep(2)
    
    p.terminate()
    
    print "Attack was finished"

Basitçe yukarıda Run fonksiyonunu tetikleyecek bir process oluşturudum bu fonksiyon çalışacak ve kendi içersinde 20 tane ping request packeti üretip çalışmayı bitiricek.Fakat ben bu process’in 2 saniye çalışıp daha sonra bitmesini istiyorum ama fonksiyon normal bir şekilde bitse dahi arka planda eğer ping request 20 tane atılmamışsa atılmaya devam ediyor.Ben 2 saniye sonra Run fonksiyonu çalışmayı bitirdiğinde artık ping atmasını istemiyorum.Bunun için ne yapabilirim.

Bu verdiğiniz kodları çalıştırdığımda, önce ekrana “Attack was started” yazısı yazdırılıyor, iki saniye geçiyor ve ekrana “Attack was finished” yazısı bastırılıyor ve program sonlanıyor. Run() fonksiyonunun içindeki print() fonksiyonu bile çalışamadan program sonlanmış oluyor.

20 tane ping isteğini 1 yaptığım zaman, önce “Attack was started” yazısı ekrana bastırılıyor, hemen ardından pid değeri ekrana bastırılıyor, 2 saniye sonra da “Attack was finished” yazısıyıla birlikte program sonlanıyor.

Hocam amaç çalışan process ile tetiklenden bir subprocess’i process sonlandığında sonlandırmaktır.Bu yüzden ping içerisindeki sayıyı siz 10.000 olarak görün :slight_smile:

Anlamamış olabilirim o yüzden soru sormak istiyorum. Siz p.terminate() fonksiyonunu çağırınca, Process sınıfından oluşturulmuş p işlem örneğini subprocess de tanımlanan işlem bitmeden sonlandırmıyor musunuz? Yani subprocess’deki "ping www.google.com -c 20" işlemi normal koşullarda siz p.terminate() yazmazsanız 20 saniye sonra sonlanacak. Siz 20 olan yere 10000 de yazsanız, p.terminate()'i çağırarak işlemi, işlemin bitme zamanını beklemeden sonlandırmış olmuyor musunuz?

Hocam tam olarak anlatmak istediğim şudur ki.Ben Run fonksiyonunu 2 saniye sonra sonlandırsam bile subprocess 20 veya 2000 packet üretmeden sonlanmıyor.Bende fonksiyon ne zaman sonlandırılırsa o zaman packet üretmeye biraksın istiyorum

Peki bir soru daha sorayım: şimdi diyelim bu yazdığınız kodları çalıştırdım, ve 2 saniye içinde şöyle bir sonuç aldım:

Attack was started
Attack was finished

Process finished with exit code 0

Şu dediğinize istinaden soruyorum: “subprocess 20 veya 2000 packet üretmeden sonlanmıyor.” Yukarıda paylaştığım sonuçtaki Process finished uyarısını aldıktan sonra subprocess’deki işlem çalışmaya devam mı ediyor sizce?

Evet hocam bunu wireshark kullanarak Network card’ınıza gelen packetleri inceleyerek görebilirsiniz

Teşekkür ederim, önce bir wireshark’ı indireyim, bir daha bakayım. Anlamadığım yerde soru sorabilirim herhalde, değil mi?

Programı indirdim, şöyle birşeyler denedim sonuçları sizinle paylaşmak isterim.

  1. Aşağıdaki kodları yazmadığımda, wireshark’ın ekranında 20 tane ping sayabiliyorum. Her request’e karşılık bir reply geliyor. Ayrıca ps -ef yazdığımda bu 20 saniye boyunca arka planda çalışan programlar listesinde ping gönderildiğine dair bir işlem pid değeri ile birlikte gözüküyor.
time.sleep(2)
p.terminate()
  1. Yukarıdaki kodları yazdığımda ise, 3 tane ping isteği gönderiyor ve cevabı geliyor. ps -ef yazdığımda, 2 saniye sonra process sonlandırıldığı için, işlem listesinin içinde bu işlem 2 saniye boyunca gösteriliyor.

Diğer forumda da cevaplamıştım ama buraya da yazayım, aşağıdakilere benzer bir şey yapabilirsiniz. Hangisi işinize gelirse. (İlki daha mantıklı)

_KILL = False

def run():
    proc = subprocess.Popen(command, preexec_fn=os.setsid)

    while True:
        if _KILL == True:
            proc.kill()

[...]
_KILL = True
process.terminate()
[...]
_EXIT = False

def run(count):
    for _ in range(count):
        if _EXIT == True:
            break

        subprocess.Popen(’ping google.com -c 1’.split())

[...]
_EXIT = True
process.terminate()
[...]

Bu arada, subprocess.Popen aldığı komutu yeni bir processte çalıştırır. Normalde kullanıldıktan sonra program aşağıdan çalışmaya devam eder, siz çıktısını almak için communicate() fonksiyonunu da kullanmışsınız, bu yüzden her ne kadar komut yeni bir processte çalıştırılıyor olsa da çıktıyı almak için process bitene kadar bekler.