2015-01-20 80 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