У меня есть три сценария, которые называют друг друга. Это следующие:
script1.sh:
s='./script2.py';
echo "DONE";
script2.py:
#!/usr/bin/env python3
import subprocess
subprocess.Popen(["./script3.py"])
print ("Exit script2")
script3.py:
#!/usr/bin/env python3
import time
time.sleep(20)
print ("child OK")
К сожалению, скрипт1.sh является сторонним программным обеспечением, и я не могу его изменить.
Script2.py запустит script3.py в фоновом режиме и выйдет. Он хорошо работает из командной строки. Но когда сценарий1.sh вызывает скрипт2.py, который ждет скрипта3.py. Итак, скрипт1.sh замерзает. Как я могу избежать этого?
Проблема в том, что script1.sh
- это script1.sh
stdout, и python не закончил запись в stdout до завершения script3.py
.
Одно из решений заключается в отправке stdout script3.py
другое место. Например, это позволяет script1.sh
выполнить быстро:
$ cat script2.py
#!/usr/bin/env python3
import subprocess
import sys
subprocess.Popen(["./script3.py"], stdout=sys.stderr)
print ("Exit script2")
С этим изменением, script1.sh
выйдет быстро, и намного позже на нем появится child OK
.