5
我有一個bash腳本,可以創建ssh隧道來安全地連接遠程mysql服務器,如下所示。如何在bash腳本退出時終止ssh隧道子進程
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
在bash腳本打開SSH隧道,於bash腳本退出後,我注意到,SSH隧道子進程仍然活着。
腳本退出後,如果您執行netstat,則顯示如下。
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
如何優雅地終止ssh子進程(6402)清理腳本?我曾考慮過使用'killall ssh',但它可能會殺死其他人意外創建的ssh進程。
謝謝。
非常感謝。有用。我不知道用-f選項,ssh成爲後臺進程,並繼續在腳本退出時運行。通過閱讀ssh手冊頁很難找到這個解決方案。這比'killall ssh'更好,更優雅。 – user1026669 2013-03-06 18:22:21
如果ssh的-f選項使得ssh進入後臺模式,我很好奇'echo $!'在ssh之後仍然沒有顯示任何東西。 – user1026669 2013-03-06 18:28:54
好吧,它*分支到後臺進程,這意味着bash必須明確知道獲得進程ID。如果你沒有使用'-f',而是使用'ssh -N -L $ LOCAL_PORT:localhost:3306 $ REMOTE_USER @ $ REMOTE_IP&',那麼'$!'會返回一個PID,因爲你正在處理bash作業在那個點控制。 – cwgem 2013-03-06 19:02:12