2015-01-20 73 views
0

我在本地計算機上安裝了Oracle瘦客戶機以在遠程主機上執行SQL命令。 另外,我有一個包含SQL命令的Ruby腳本(使用OCI8 gem),腳本工作正常。終止分叉進程(轉發端口)

但是,要我需要打開一個隧道,轉發到遠程Oracle監聽的端口的SQL命令:

ssh -L 1521:localhost:1521 <user>@<host> 

運行此命令登錄我到遠程主機,我不想。

我找到了下面的命令來運行,它創建了一個隧道,轉發了特定的端口,並且我可以成功地運行包含SQL命令的Ruby腳本。

tunnel = fork do 
    exec "ssh -f <user>@<host> -L 1521:localhost:1521 -N" 
end 

因此,隧道是在後臺創建的,但是,我也需要終止隧道,從遠程實例斷開連接。我嘗試了以下方法:

Process.kill('HUP', tunnel) 

但是,隧道並未死亡。

有沒有一種方法可以在Ruby腳本中終止/終止隧道?

回答

0

A HUP信號不殺死一個進程,只是發送一個信號,該進程可以自由地忽略它。 HUP通常用於指示應該重新加載配置文件。

你想要的是:

Process.kill('INT', tunnel) 

更積極的版本,其中要求禮貌不工作的情況:

Process.kill('KILL', tunnel) 
+0

感謝信息。然而,你的解決方案沒有奏效,隧道仍然保持開放。當然,我仍然可以運行ruby腳本,成功運行sql命令,對遠程oracle數據庫實例 – user2872898 2015-01-20 23:22:24

+0

。 '-f'選項創建一個子子進程,如果不跟蹤具有哪個PID的子進程,它就會被分離。如果你可以避免'-f',你可以直接管理隧道。 – tadman 2015-01-21 19:22:32

+1

感謝您的更新。 tadman。現在我發現一個解決方法,仍然使用-f,但是我刪除了「-N」標誌,而是傳遞了一個睡眠值,exec「ssh -f @ -L 1521:localhost:1521 sleep 60」這樣隧道被創建,但在達到睡眠時間後終止。 – roland 2015-01-22 21:08:59