Portál AbcLinuxu, 9. května 2025 22:45

Dotaz: Python spouštění shellových skriptů

15.3.2012 00:40 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Python spouštění shellových skriptů
Přečteno: 682×
Odpovědět | Admin
Zdravím,

tvořím v Pythonu (2.6.6) jednoduchý prográmek, který když dostane HTTP žádost na konkrétní URL, spustí určitou akci. Konkrétně, získá data z databáze, vyrobí konfigurační soubory pro firewall a dhcp podle šablon a resetuje tyto služby. S jednorázovými skripty (iptables) to funguje v pořádku, ale takto spuštěný dhcp-server se drží socketu, na kterém naslouchá rodič a když rodič z nějakého důvodu skončí, nemůžu ho znovu spustit protože cílový port už drží proces dhcp-serveru.

Z toho co jsem se dočetl v dokumentaci, tak voláním subprocess.call() nebo subprocess.Popen() vždycky vyrobím potomka, ať už přes fork() nebo execvp(). Já ale potřebuju, aby se skript spustil v novém shellu jako nový proces, ne jako potomek toho to skriptu. Jde to vůbec nějak?

Pro ukázku jsem vyrobil dva jednoduché skripty, aby bylo vidět, jak to celé (ne)funguje.

foo.sh - spustí cokoliv co zadám v argumentu
#!/bin/bash
$1
foo.py - vyrobí socket a spustí skript foo.sh
import subprocess
import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost',8080))
s.listen(10)

subprocess.call(['foo.sh', 'firefox'])

time.sleep(30)
Podle fuser, všechny procesy drží port 8080
yenn@wintermute:~$ fuser -v 8080/tcp
                     USER        PID ACCESS COMMAND
8080/tcp:            yenn       9825 F.... python
                     yenn       9826 F.... foo.sh
                     yenn       9827 F.... firefox
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Martin Matějek (tazatel))
15.3.2012 10:23 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: Python spouštění shellových skriptů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ja bych to videl takhle:

subprocess.call(['./foo.sh', 'firefox'], close_fds = True)
(ono je to v dokumentaci napsano dost zmatene).
15.3.2012 16:49 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Rozbalit Rozbalit vše Re: Python spouštění shellových skriptů
Tohle to vyřešilo, díky!
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!
Řešení 1× (Martin Matějek (tazatel))
rADOn avatar 15.3.2012 13:17 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python spouštění shellových skriptů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dhcp server je démon. Démon je proces který se odpojil od tty a od svého předka resp. jeho předek je init. Na to je takovej postup který každý takový program ovládá a nemusíš se v tom vrtat. Démony nespoštěj přímo ale měj je nastarovaný initem a jen jim posílej signály. Většina démonů načte nový kofigurák když dostane HUP nebo USR1. Jako bonus ti to bude lépe fungovat i když dostaneš dva http requesty najednou.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
15.3.2012 17:08 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Rozbalit Rozbalit vše Re: Python spouštění shellových skriptů
Debianovský init skript pro dhcpd s parametrem restart nebo force-reload dhcpd zastaví, znovu spustí a navíc ještě před spuštěním zkontroluje konfigurační soubor, takže zůstanu u volání init skriptu. Ale díky moc za rady.

PS: O zpracování http requestů se stará webserver (Python + CherryPy), takže to by neměl být problém.
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!
rADOn avatar 16.3.2012 13:44 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python spouštění shellových skriptů
Koukám že dhcpd opravdu neumí načíst konfigurák na signál, takže se omlouvám za vnášení chaosu. Všichni ostatní démoni co znám to umí.
"2^24 comments ought to be enough for anyone" -- CmdrTaco

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.