Ho uno script bash che crea il tunnel ssh per connettere il server mysql remoto in modo sicuro come mostrato di seguito.come terminare il processo figlio del tunnel ssh all'uscita dello script bash
ssh -f -N -L $LOCAL_PORT:localhost:3306 [email protected]$REMOTE_IP
mysql -P $LOCAL_PORT -h 127.0.0.1 -u lapl_stg -p${REMOTE_DB_PASS} <./t1.sql> ./out.txt
Dopo aver aperto il tunnel ssh nello script bash, in caso di uscita dello script bash, ho notato che il processo figlio tunnel SSH è ancora vivo.
Dopo lo script, se si esegue netstat, viene visualizzato di seguito.
netstat -a -n -p -l
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3308 0.0.0.0:* LISTEN 6402/ssh
tcp 0 0 10.44.44.11:46836 10.44.44.21:22 ESTABLISHED 6402/ssh
tcp6 0 0 ::1:3308 :::* LISTEN 6402/ssh
Come si termina elegantemente il processo figlio ssh (6402) per pulire lo script? Ho pensato di usare 'killall ssh' ma potrebbe uccidere altri processi ssh creati da altri per sbaglio.
Grazie.
Grazie mille. Funziona. Non lo sapevo, con l'opzione -f, ssh diventa il processo in background e continua a essere eseguito all'uscita dallo script. È difficile trovare questa soluzione semplicemente leggendo la pagina man di ssh. Questo è molto meglio e più elegante di 'killall ssh'. – user1026669
Se l'opzione -f di ssh rende lo ssh in modalità background, sono curioso di sapere come mai "echo $!" ancora non mostra niente subito dopo lo ssh. – user1026669
Bene, è * forking * in un processo in background, il che significa che bash deve sapere esplicitamente per ottenere l'ID del processo. Se non hai usato '-f' e invece hai' ssh -N -L $ LOCAL_PORT: localhost: 3306 $ REMOTE_USER @ $ REMOTE_IP & 'allora' $! 'Restituirebbe un PID dato che hai a che fare con il lavoro bash controllo a quel punto. – cwgem