0

希望这应该是一个容易回答的问题。我试图让 mumble-ruby 自动运行我已经启动并运行了所有东西,除了在运行这个简单的脚本之后它运行但结束。简而言之:

  • 从终端运行它,我得到“按 Enter 终止脚本”,它可以工作。
  • 通过 cronjob 运行它会运行脚本,但会结束它并运行cli.disconnect(我假设)。

我希望下面的脚本在指定时间通过 cronjob 自动运行,并且在服务器关闭之前不会结束。

#!/usr/bin/env ruby

require 'mumble-ruby'

cli = Mumble::Client.new('IP Address', Port, 'MusicBot', 'Password')
cli.connect
sleep(1)
cli.join_channel(5)
stream = cli.stream_raw_audio('/tmp/mumble.fifo')
stream.volume = 2.7

print 'Press enter to terminate script';
gets
cli.disconnect
4

3 回答 3

3

假设您在 Unix/Linux 系统上,您可以在screen会话中运行它。(这是一个 Unix 命令,而不是脚本函数。)

如果你不知道是什么screen,它基本上是一个“可分离”的终端会话。您可以打开一个screen会话,运行此脚本,然后从该screen会话中分离。即使在您注销后,该分离的会话仍将保持活动状态,从而使您的脚本继续运行。screen(如果您想手动关闭它,您可以稍后重新附加到该会话。)

screen非常简洁,Unix/Linux 上的每个开发人员都应该意识到这一点。

如何在不阅读任何文档的情况下做到这一点:

  • 在将运行脚本的服务器上打开一个终端会话
  • 运行screen- 您现在将在新的屏幕会话中处于新的 shell 提示符下
  • 运行你的脚本
  • 输入ctrl-athen d(不带 ctrl;“d”代表“detach”)与screen(但仍保持运行)分离

现在你回到了你的第一个 shell。screen您的脚本在您的会话中仍然有效。您可以断开连接,screen会话将继续进行。

你想回到那个screen并手动关闭应用程序吗?简单的!运行screen -r(用于“重新连接”)。要终止screen会话,只需重新连接并退出 shell。

您也可以screen同时运行多个会话。(如果有多个screen运行,您需要为 提供一个参数screen -r。)

查看一些screen文档!

这是一个屏幕操作方法。 搜索“gnu screen howto”了解更多信息。

于 2013-05-25T16:41:04.300 回答
1

使用无限循环。尝试:

while running do
  sleep(3600)
end

您可以在需要时使用 exit 终止。这将每小时运行一次循环,因此它不会占用处理时间。断开方法之前的无限循环将阻止它被调用,直到服务器关闭。

于 2013-05-25T15:19:43.693 回答
1

有很多方法可以剥这只猫的皮...... :)

我的想法是使用您的脚本(调用它foo)并删除最后 3 行。在您的/etc/rc.d/rc.local文件中(注意:这适用于 Ubuntu 和 Fedora,不确定您正在运行什么 - 但它有类似的东西)您将添加nohup /path_to_foo/foo 2>&1 > /dev/null&到文件的末尾,以便它在后台运行。如果您只想运行它并让它运行,您也可以直接在终端上运行该命令。您必须确保它foo可以使用chmod +x /path_to_foo/foo.

于 2013-05-25T19:05:08.660 回答