Come si invia un Ctrl-C
a più processi ssh -t
negli oggetti Popen()
?Invia Ctrl-C ai processi remoti avviati tramite sottoprocesso.Popen e ssh
ho qualche codice Python che prende il via uno script su un host remoto:
# kickoff.py
# i call 'ssh' w/ the '-t' flag so that when i press 'ctrl-c', it get's
# sent to the script on the remote host. otherwise 'ctrol-c' would just
# kill things on this end, and the script would still be running on the
# remote server
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
a.communicate()
che funziona grande, ma ho bisogno di dare il via più script sulla macchina remota:
# kickoff.py
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
b = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'b'])
a.communicate()
b.communicate()
Il risultato di questo è che Ctrl-C
non uccide in modo affidabile tutto e il mio terminale viene sempre ingarbugliato in seguito (devo eseguire 'reset'). Quindi, come posso uccidere entrambi gli script remoti quando il principale viene ucciso?
Nota: sto tentando di evitare l'accesso all'host remoto, la ricerca di "script.sh" nell'elenco dei processi e l'invio di un SIGINT a entrambi i processi. Voglio solo essere in grado di premere Ctrl-C
sullo script di kickoff e fare in modo che entrambi i processi remoti vengano eliminati. Una soluzione meno ottimale può comportare deterministicamente la ricerca dei PID degli script remoti, ma non so come farlo nel mio attuale set-up.
Aggiornamento: lo script che viene avviato sul server remoto avvia effettivamente diversi processi figli e mentre uccide lo ssh
uccide lo script remoto originale (probabilmente b/c di SIGHUP), le attività figli non vengono uccise.
ho cambiato il titolo a qualcosa che descrive in realtà ciò che si vuole fare. –
Non ho idea se funzionerà, ma hai provato a inviare la fine del byte di testo "\ x03" al sottoprocesso? È equivalente a Ctrl-C. –
@Thomas K: Buona idea, ma purtroppo funzionerà solo se "\ x03" viene inviato al lato di input di un terminale a cui il processo è collegato (o, naturalmente, se il programma interpreta i dati in quel modo!) .. Purtroppo in questo caso il sottoprocesso avviene tramite una pipe piuttosto che un terminale, quindi la gestione che converte Ctrl-C in SIGINT non è presente :( – psmears