2012-03-22 24 views
5

कारणों से मैं अंदर नहीं जाऊंगा, मुझे फ्रीबीएसडी 8.1 पर पाइथन थ्रेड से उप-प्रोसेस के भीतर 'टॉप-एम आईओ-डी 2 10' का एक संस्करण चलाने की आवश्यकता है। समस्या यह है कि ऐसा लगता है कि कभी-कभी सिगेटू का उत्पादन होता है (कुछ कोड-निर्भर स्थितियों के तहत जिन्हें मैंने अभी तक नहीं समझा है), शीर्ष और थ्रेड को पूरी तरह से रोकना। अन्य बार, ऐसा लगता है कि सिग्टोउ का उत्पादन नहीं होता है, लेकिन शीर्ष या धागा वैसे भी फंस जाता है।थ्रेड में 'टॉप' चलाना सिगेटू

शीर्ष पर आउटपुट सिस्टम पर शीर्ष 10 प्रक्रियाओं के लिए आईओ आंकड़ों के दो सेट उत्पन्न करना चाहिए, जहां पहला सेट "पूर्ण" संख्या है और दूसरा सेट अंतिम सेट के आंकड़ों का बढ़ता अंतर है, एक पहले दूसरा। इस आदेश को टर्मिनल पर या शेल स्क्रिप्ट के भीतर चलाना, चाहे आउटपुट को रीडायरेक्ट करना है या नहीं, ठीक काम करता है।

जब समस्या होती है, ऐसा लगता है कि 'टॉप' आउटपुट के पहले सेट को लिखता है, लेकिन फिर दूसरे सेट को आउटपुट करने से पहले सिगेटू को लटका/प्राप्त करता है। नीचे नमूना कोड में, प्रक्रिया आंकड़ों का केवल एक सेट आउटपुट फ़ाइल में लिखा गया है।

मैंने सिगेटू सिग्नल को 'ट्रस' के तहत पाइथन लिपि चलाने का पता लगाया, लेकिन ऐसा लगता है कि 'ट्रस' और 'टॉप' के बीच बातचीत एक उलझन में मामला हो सकता है, क्योंकि बस truss top -d 2 चल रहा है सिग्नल और लटकता है, जैसा कि नीचे है :

... 
ioctl(1,TIOCGETA,0xffffe460)    = 0 (0x0) 
ioctl(1,TIOCGETA,0xc6b138)   = 0 (0x0) 
ioctl(1,TIOCGETA,0xffffe410)    = 0 (0x0) 
ioctl(1,TIOCGWINSZ,0xffffe460)   = 0 (0x0) 
ioctl(1,TIOCGWINSZ,0xffffe930)   = 0 (0x0) 
ioctl(1,TIOCGETA,0x50e560)   = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGINT|SIGQUIT|SIGTSTP,0x0) = 0 (0x0) 
ioctl(1,TIOCGETA,0x50e560)   = 0 (0x0) 
SIGNAL 22 (SIGTTOU) 

यहां नमूने Python स्क्रिप्ट है जो लटका और/या SIGTTOU reproduces है:

import subprocess 
from threading import Thread 

def run(): 
    with open("top.log", "wb") as f: 
     subprocess.Popen(("/usr/bin/top", "-m", "io", "-d", "2", "10"), stdout=f, stderr=f, stdin=subprocess.PIPE).communicate() 

if __name__ == "__main__": 
    th = Thread(target=run) 
    print "Starting" 
    th.start() 
    th.join() 

मेरा आखिरी रन के माध्यम से, यह नमूना कार्यक्रम SIGTTOU पेश नहीं किया, पर, लेकिन शीर्ष लटका था। ट्रस शो:

.... 
open("/usr/local/lib/python2.7/lib-tk/_heapq.pyc",O_RDONLY,0666) ERR#2 'No such file or directory' 
stat("/usr/local/lib/python2.7/lib-dynload/_heapq",0x7fffffffa500) ERR#2 'No such file or directory' 
open("/usr/local/lib/python2.7/lib-dynload/_heapq.so",O_RDONLY,0666) = 5 (0x5) 
fstat(5,{ mode=-rwxr-xr-x ,inode=238187,size=22293,blksize=16384 }) = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
open("/usr/local/lib/python2.7/lib-dynload/_heapq.so",O_RDONLY,057) = 6 (0x6) 
fstat(6,{ mode=-rwxr-xr-x ,inode=238187,size=22293,blksize=16384 }) = 0 (0x0) 
pread(0x6,0x80074c2e0,0x1000,0x0,0xffff800800653120,0x8080808080808080) = 4096 (0x1000) 
mmap(0x0,1069056,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34389442560 (0x801c54000) 
mmap(0x801c54000,12288,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,6,0x0) = 34389442560 (0x801c54000) 
mmap(0x801d56000,12288,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,6,0x2000) = 34390499328 (0x801d56000) 
mmap(0x0,36864,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366377984 (0x800655000) 
close(6)      = 0 (0x0) 
mmap(0x0,832,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34366414848 (0x80065e000) 
munmap(0x80065e000,832)    = 0 (0x0) 
sigprocmask(SIG_SETMASK,0x0,0x0)   = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
sigprocmask(SIG_SETMASK,0x0,0x0)   = 0 (0x0) 
close(5)      = 0 (0x0) 
close(4)      = 0 (0x0) 
close(3)      = 0 (0x0) 
close(2)      = 0 (0x0) 
fstat(1,{ mode=crw------- ,inode=102,size=0,blksize=4096 }) = 0 (0x0) 
ioctl(1,TIOCGETA,0xffffe400)    = 0 (0x0) 
Starting 
write(1,"Starting\n",9)    = 9 (0x9) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
_umtx_op(0x7fffffffe1d8,0x3,0x1,0x0,0x0,0x0)  = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGABRT|SIGEMT|SIGKILL|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2) = 0 (0x0) 
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGABRT|SIGEMT|SIGKILL|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2) = 0 (0x0) 
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
mmap(0x7fffffbde000,135168,PROT_READ|PROT_WRITE,MAP_STACK,-1,0x0) = 140737484021760 (0x7fffffbde000) 
mprotect(0x7fffffbde000,4096,PROT_NONE)  = 0 (0x0) 
thr_new(0x7fffffffe220,0x68,0x800a9f4c0,0x186fc,0xffffffff,0x0) = 0 (0x0) 
sigprocmask(SIG_SETMASK,0x0,0x0)   = 0 (0x0) 
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34390511616 (0x801d59000) 
mmap(0x801f59000,684032,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34392608768 (0x801f59000) 
munmap(0x801d59000,684032)   = 0 (0x0) 
_umtx_op(0x8010127f8,0x10,0x1,0x0,0x0,0x0) = 0 (0x0) 
_umtx_op(0x800e0b438,0xf,0x0,0x0,0x0,0x0) = 0 (0x0) 
_umtx_op(0x800e0b438,0x10,0x1,0x0,0x0,0x0) = 0 (0x0) 
_umtx_op(0x800e0b438,0x10,0x1,0x0,0x0,0x0) = 0 (0x0) 
_umtx_op(0x800e0b438,0x10,0x1,0x0,0x0,0x8080808080808080) = 0 (0x0) 
open("top.log",O_WRONLY|O_CREAT|O_TRUNC,0666) = 2 (0x2) 
fstat(2,{ mode=-rw-r--r-- ,inode=70860,size=0,blksize=16384 }) = 0 (0x0) 
pipe(0x7fffffbfd910)     = 0 (0x0) 
pipe(0x7fffffbfd870)     = 0 (0x0) 
fcntl(6,F_GETFD,)    = 0 (0x0) 
fcntl(6,F_SETFD,FD_CLOEXEC)   = 0 (0x0) 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGABRT|SIGEMT|SIGKILL|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2) = 0 (0x0) 
fork()      = 21503 (0x53ff) 
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0) 
close(6)      = 0 (0x0) 
close(3)      = 0 (0x0) 
read(5,0x801e31024,1048576)   = 0 (0x0) 
close(5)      = 0 (0x0) 
fcntl(4,F_GETFL,)    = 2 (0x2) 
fstat(4,{ mode=p--------- ,inode=0,size=0,blksize=4096 }) = 0 (0x0) 
close(4)      = 0 (0x0) 

मैं SIGTTOU देखा है और termios TOSTOP ध्वज के लिए संदर्भ पाया, और मैं मुख्य थ्रेड में इसके साथ fiddled गए बच्चे सूत्र में, है, और वातावरण में अजगर लागू, सभी कोई फायदा नहीं। यह एक शैक्षिक प्रक्रिया रही है, लेकिन मैं अभी तक नहीं हूं।

मैंने यह सुनिश्चित करने के लिए परीक्षण चलाए हैं कि शीर्ष प्रक्रिया बनाई गई है और पाइथन प्रक्रिया के प्रक्रिया समूह में रहती है (सिगेटू दस्तावेज के आधार पर, यदि यह नहीं था, तो यह कारण होगा सिगेटू), और यह ठीक लगता है: पीजीआरपी पाइथन पीआईडी ​​/ पीजीआरपी के समान होता है।

मैंने subprocess.check_output के साथ 'शीर्ष' चलाने की कोशिश की है और .pop() के साथ खोल = सही, खोल = गलत, और std {out, err, in} को रीडायरेक्ट कर रहा है, इनमें से कोई भी नहीं लगता है इस अंतिम परिणाम को बदलने के लिए। मैंने subprocess के माध्यम से निष्पादित '/ bin/sh -c' कमांड का उपयोग करके 'शीर्ष' चलाने का प्रयास किया है, इसका कोई फायदा नहीं हुआ है।

कुछ शेल स्क्रिप्ट के भीतर 'टॉप' चलाने की तरह अर्द्ध अजीब कुछ भी किए बिना, जो मेरे पायथन थ्रेड का उपयोग करता है, या थ्रेडिंग का उपयोग करने के बजाय os.fork() का सहारा लेता है, मैं इस मुद्दे को कैसे प्राप्त कर सकता हूं, और रूट क्या है कारण?

उत्तर

1

SIGTTOU जब एक प्रक्रिया को नियंत्रित करने के लिए टर्मिनल बदलने का प्रयास किया जाता है:

कार्यान्वयन का समर्थन करता है, तो काम-नियंत्रण, यदि उल्लेख नहीं किया, एक पृष्ठभूमि प्रक्रिया-समूह में प्रक्रियाओं टर्मिनल के उपयोग में प्रतिबंधित कर रहे हैं -control-functions (टर्मियोस देखें (3 सी))। इन कार्यों को करने के प्रयासों से प्रक्रिया-समूह सिग्नल सिग्टो को भेजा जा सकता है। अगर कॉलिंग प्रक्रिया सिग्नल सिग्टोऊ को सिग्नल भेजने या सिग्नल सिग्टो को भेजने के बिना नियंत्रण-फ़ंक्शन आय निष्पादित करने का प्रयास करती है, तो सिग्नल सिग्टोउ को अनदेखा या अवरुद्ध करती है।

(Terminal access control से)

इसका क्या मतलब है? इसका मतलब है कि शीर्ष टर्मिनल के बारे में कुछ बदलने की कोशिश कर रहा है और यह कह रहा है कि यह ऐसा नहीं कर सकता है, और SIGTTOU के लिए डिफ़ॉल्ट कार्रवाई प्रक्रिया को रोकने से रोकने के लिए है (जिसे आप इसे कॉल करते हैं)।

आप जो करने का प्रयास कर सकते हैं वह fork() का उपयोग अपने स्वयं के प्रक्रिया समूह में लाने के लिए, एक नियंत्रण टर्मिनल के बिना है। इसे top को कॉल करने के लिए जो कुछ भी कॉल करना है, उसे कॉल करने की अनुमति देनी चाहिए, और चूंकि कोई नियंत्रण टर्मिनल नहीं है, इसका कोई प्रभाव नहीं पड़ेगा।

हालांकि शीर्ष को कभी भी गैर-इंटरैक्टिव कहा जाने वाला नहीं था, क्या आप ps का उपयोग कर एक ही जानकारी प्राप्त करने में सक्षम नहीं हैं?


इस ब्लॉग पोस्ट: http://www.technovelty.org/tips/sigttou-and-switching-to-canonical-mode.html भी बताते हैं क्या एक स्पष्ट तरीके से चल रहा है। आशा करता हूँ की ये काम करेगा।

+0

। इस दिन तक हालांकि मुझे अभी भी यकीन नहीं है कि शीर्ष पर टर्मिनल (या क्यों) के बारे में संशोधित करने का प्रयास कर रहा है। दुर्भाग्य से मैं इसे विरासत प्रणाली में काम कर रहा हूं, इसलिए मुझे वास्तव में अपने कोड में 'शीर्ष' के कच्चे आउटपुट का उत्पादन करने की आवश्यकता है। मैं पाइथन की 'पीटीआई लाइब्रेरी' का उपयोग करके और इसके अंदर शीर्ष पर चलकर इस पर काम करना समाप्त कर दिया। हालांकि, अन्य तकनीकी कठिनाइयों के कारण, यह भी आउटपुट से एएनएसआई अनुक्रमों को कम से कम पार्स और स्ट्रिप करना था। (लेकिन यह अब काम करता है!) :) – Anthem

0

क्या आपने शीर्ष के साथ -b विकल्प का उपयोग करने का प्रयास किया है? यह बैच-जॉब्स और गूंगा टर्मिनल के लिए है और यह करने के लिए शीर्ष पर बता सकता है, जो कुछ भी कर रहा है वह सिग्नल ट्रिगर करता है ...

2

मुझे एहसास है कि यह प्रश्न थोड़ा पुराना है, लेकिन यदि आप अभी भी दौड़ रहे हैं त्रुटियों में, मुझे इसे गंदगी में डीबग करना अच्छा लगेगा।

मूल कारण: आपका SIGTTOU हो रहा है क्योंकि आपके अजगर दुभाषिया जब आप th = Thread(target=run) फोन और top बताया नहीं किया गया है पृष्ठभूमि धागा बनाने के लिए forking है/यह टर्मिनल का उपयोग नहीं किया जाना चाहिए पता नहीं है। आप सिग्नल देख रहे हैं क्योंकि पृष्ठभूमि प्रक्रिया के रूप में जब आप इस टीटीई सेटिंग्स में होने से इस व्यवहार को अस्वीकार कर देते हैं तो top टर्मिनल (या इसके इम्यूलेशन मोड को बदलने) को लिखने की कोशिश कर रहा है।

tostop (-tostop) 
      Send (do not send) SIGTTOU for background output. This causes back- 
      ground jobs to stop if they attempt terminal output. 

वर्कअराउंड: पृष्ठभूमि धागे अपनी स्क्रिप्ट (stty -tostop; python my_script.py; stty tostop) के चलाने के दौरान टर्मिनल पर उत्पादन फेंक करने की अनुमति दें या ('-n') फ्लैग जोड़ने के

man stty से मैं करूंगा इस अधिक संक्षेप बताते हैं top की आपकी उपप्रोसेसर कॉल।


विस्तार: केवल एक समूह प्रति प्रक्रिया अग्रभूमि और बाकी हिस्सों में हो सकता है पृष्ठभूमि में रहते हैं - अग्रभूमि प्रक्रिया मैं एक tty से संभालती है/हे और बाकी पृष्ठभूमि के रूप में रहना चाहिए प्रक्रियाओं या आप नौकरी नियंत्रण सिग्नल फेंकना शुरू कर देंगे (उदाहरण के लिए सिग्टिन/सिगेटू)।

अपने अजगर स्क्रिप्ट के निष्पादन के दौरान, मेरा मानना ​​है कि निम्नलिखित होता है:

$SHELL #(controls TTY) 
$ python my_script.py #(tcsetpgrp() is called to hand off control of TTY) 
~~~ heck yeah, snake party ~~~ 
th = Thread(target=run) #(run target=proc in background) 
print "Starting" #(still okay -- this gets handed up to the foreground interpreter) 
th.start() 
#(here be dragons, std i/o in background fork) 
subprocess.Popen(("/usr/bin/top", "-m", "io", "-d", "2", "10").communicate() 

मैं FreeBSD manual for its top implementation की जाँच की और मैं निम्नलिखित धूम्रपान बंदूक पाया:

DESCRIPTION 
     Top displays the top processes on the system and periodically updates 
     this information... 

     Top makes a distinction between terminals that support advanced capa- 
     bilities and those that do not...If the output of top is redi- 
     rected to a file, it acts as if it were being run on a dumb terminal. 

... 
OPTIONS 
    -i  Use "interactive" mode. In this mode, any input is immediately 
     read for processing. See the section on "Interactive Mode" for 
     an explanation of which keys perform what functions. After the 
     command is processed, the screen will immediately be updated, 
     even if the command was not understood. This mode is the 
     default when standard output is an intelligent terminal. 
    ... 
    -n  Use "non-interactive" mode. This is identical to "batch" mode. 

top जबकि यह नहीं है जानते हैं कि यह पृष्ठभूमि प्रक्रिया में चलाया जा रहा है (फ़ाइल पाइपिंग आपके पायथन संदर्भ प्रबंधक के साथ किया जा रहा है) और आपने गैर-इंटरैक्टिव मोड निर्दिष्ट नहीं किया है, यह मानते हुए कि यह tty का उपयोग करने के लिए स्वतंत्र है - जिसका अर्थ है कि आप शायद रों यदि सिग्नल संसाधित होते हैं तो top किसी भी STDIN और SIGTTOU संकेतों को रोकता है और यह स्क्रीन को अपडेट करने का प्रयास करता है।

FreeBSD के शीर्ष कार्यान्वयन से विशेष रुचि के

, जब सहभागी या नहीं कहा जाता कि क्या होता है में अंतर:

आपका विचार shell=True सत्यापन जोड़ने के लिए यह सिद्धांत sets the child process of 'top' to the PID of the shell that subprocess.Popen(..) spawns है, जो अभी भी पृष्ठभूमि में है पायथन धागा

: से मेल खाता है यही कारण है कि मैं तब से पता चला है (N.B. क्षमा याचना मैं एक FreeBSD 8.1 मेजबान के लिए उपयोग अभी अपने मेजबान ओएस पर व्यवहार को सत्यापित करने के लिए नहीं है।)