好的,我有 2 台 Linux 机器,机器 A 和机器 B。机器 A 是一台运行 icecast 音频服务器的服务器。机器 B 是工作室中的一台台式机,运行 BUTT(使用此工具进行广播),这是一个将音频发送回机器 A 的 x11 应用程序。
机器 B 上的 Butt 有时会崩溃(事实上,我们尝试过的任何应用程序以及 Windows 上的应用程序最终都会崩溃),从而终止流。但是我发现我将 icecast 配置为在源断开连接时运行 stript。我有用于 A 和 B 之间 ssh 的私钥授权。我有一个脚本,如果我在 B 上运行它(通过正常的交互式 ssh),它将重新启动 butt。我不知道如何在 A 上编写脚本,以便它将运行我在 B 上的脚本。
我尝试过这个:
#!/bin/bash
ssh username_placeholder@B '/home/username_placeholder/broadcast.sh'
exit
从 A 运行。但这似乎让 ssh 保持活动状态。我只想运行它然后挂断。broadcast.sh 如下所示:
#!/bin/bash
killall butt
env DISPLAY=:0 butt&
exit
这是因为 butt 仅在 gui 模式下运行。无论如何,我们确实希望不时在工作室中看到 gui。那么我该如何让它运行该脚本并挂断,或者有没有更好的方法可以在 A 上执行此操作,而无需尝试在 B 上调用脚本。如果 butt 仍在运行,我希望它杀死它,然后启动它(记住它仍然必须显示在 B 上,而不是 A 上。并且 A 是可以知道 B 上的源何时挂断的计算机。)
如果有人关心的话,计算机 A 运行 ubuntu 服务器,而计算机 B 运行 linux mint。
答案1
您应该考虑使用 screen 命令,它将允许您做您想做的事情,同时还有能够在任何时间点重新连接到 shell 的额外好处。
SSH 到远程主机
machine_a:> ssh machine_b
使用 SCREEN 启动新 Shell
machine_b:> screen
machine_b:> run your script here
脱离屏幕
( Press Ctrl-a then ctrl-d to disconnect from the screen )
退出服务器外壳
machine_b:> exit
machine_a:>
重新登录服务器(稍后)
machine_a:>ssh machine_b
列出用户可用的所有屏幕
screen -list (to show a list of all screen sessions that exist).
eg.
username@machine_b:~/> screen -list
There are screens on:
30264.pts-5.machine_b (Detached)
2 Sockets in /var/run/uscreens/S-username.
重新连接到分离的屏幕
machine_b:> screen -dr 30264
在此阶段,您可以看到您离开时的脚本/命令/shell。即使您运行的命令是 xwindows 应用程序,并且将显示设置为远程服务器显示。
要以与仅使用 ssh 相同的方式创建运行脚本的远程屏幕,请尝试以下操作:
ssh -t username_placeholder@B 'screen -d -m /home/username_placeholder/broadcast.sh'
答案2
您必须从机器 A 使用 ssh 的‘-f’选项运行广播脚本:
#!/bin/sh
ssh -f username_placeholder@B /home/username_placeholder/broadcast.sh
这将自动使“broadcast.sh”进入后台。
‘broadcast.sh’脚本本身应该如下所示:
#!/bin/sh
killall butt
DISPLAY=:0 butt