Skrypt uruchamia drugi skrypt tak aby pracowały niezależnie

0

Hey mam skrypt który po uruchomieniu, uruchamia drugi skrypt za pomocą os.system("python3 ./drugi_skrypt.py &"). Wszystkie odbywa się w Linuksie chociaż to chyba bez znaczenia :)
Problem polega na tym, że póki skrypt pierwszy działa, skrypt drugi też działa. Jak tylko skrypt pierwszy kończy pracę to automatycznie zakańcza skrypt drugi.

Gdy na końcu polecenia nie dam znaku & to skrypt 1 czeka aż skrypt 2 skończy działanie ale mi zależy żeby one działały niezależnie. Da się to jakoś ogarnąć?

0

Musiałbyś zrobić jakieś os.fork() żeby dostać drugi niezależny proces.

1
subprocess.Popen(['python3', 'drugi.py'])
1

Samo forkowanie/odpalenie procesu przez subprocess rozwiąże problem czekania, ale z tego co kojarzę żeby proces potomny nie został ubity po zabiciu głównego musiałbyś jeszcze odpalić go jako detached za pomocą odpowiednich flag ;)

Przykład

Btw. Kiedyś przypadkiem odkryłem, że procesy z puli procesów np. multiprocessing czy concurrent.futures niekoniecznie chcą umierać, gdy główny proces padnie lub zostanie zabity, a one akurat coś robią. Akurat dla mnie była to wada... :D

0

W sumie nie wiem czy zadziala, ale sprobuj:

os.system("nohup python3 ./drugi_skrypt.py &")
0

Można uruchomić skrypt jak drugi proces i do tego służy komenda os.spawnl, więcej na ten temat masz tutaj: https://docs.python.org/2/library/os.html#os.spawnl

1

Preferujcie subprocess.

[...] The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. [...]
https://docs.python.org/3/library/os.html?highlight=spawn#os.system

Replacing Older Functions (os.system, os.spawn*) with the subprocess Module
https://docs.python.org/3/library/subprocess.html#replacing-older-functions-with-the-subprocess-module

Tak samo os.path zastępowany jest przez pathlib. Rozważano nawet kastrację modułu os, żeby nadać mniej światłym odpowiedni kurs.

0

os.fork() z tego co czytałem (nie sprawdzałem) to tworzy nowy proces ale podrzędny więc zamknięcie procesu matczynego zakańcza wszystkie nowo utworzono procesy więc też nie zadziała. Chyba, że się mylę? os.fork() z flagą detached działa dla Windows z tego co opisuje przykład który podałeś, muszę wniknąć jak to się sprawdzi dla Linux'a
mózg zamiana starej funkcji nowa z użyciem subprocess to może być super sprawa ale muszę się tym pobawić.
Jak coś ogarnę to będę pisał

1 użytkowników online, w tym zalogowanych: 0, gości: 1