我的机器上有一些用户,我允许他们运行小型 Mumble 语音服务器。我希望他们能够从网站(由 Apache 运行)启动/停止他们的语音服务器。在当前设置下,我将每个服务器作为不同的用户(该人的特定用户帐户)运行。
我不知道的是立即启动/停止服务器的最佳方法。目前,每当网站想要启动/停止服务时,我都会在数据库中输入一个条目。然后,我有一个 cron 脚本,它每分钟运行一次,在数据库中查找这些启动/停止。该 cron 脚本将切换到用户帐户并以该用户身份运行服务器。我的问题是,该操作可能需要大约 1 分钟才能发生。
有没有更灵敏的方法来实现这一点?
答案1
除了写入数据库之外,您是否考虑过写入命名管道?您可以为每个用户创建一个命名管道,然后创建一个进程来监视每个命名管道。当“重新启动”命令到来时,立即重新启动该进程。
这不是一个完整的解决方案,可以改进,但它应该让您了解如何监视命名管道并重新启动进程。
while read line <$pipe
do
if [[ "$line" == 'restart' ]]; then
restart_some_service
fi
done
答案2
答案3
如果您为其托管服务器的这些人是值得信赖的,并且不会向服务器发送垃圾邮件/黑客攻击,那么为什么不直接对 Web 界面进行编程以直接将启动/停止传递给 shell
例如,在 PHP 中,您可以将其编程到页面中:
<?php
// checks, templating, blah, blah, blah
$status = exec('/path/to/service/mumbled status')
if ($status == "stopped")
// display start button, hook exec('mumbled stop') command to it
if ($status == "running")
// display stop button, hook exec('mumbled start') command to it
?>
如果是我,我会走那条路,但那就是我。
答案4
您的 cron 方法是正确的。大多数其他方法都有各种安全问题。为了更快地实现同样的想法,您可以触摸一个文件,并使用 inotify 来检测它是否被修改。 inotify 速度非常快。 “inotify-tools”是一组易于使用的使用 inotify 的命令行工具。 inotify-tools 的 github 站点上有一些很好的示例。
从: https://github.com/rvoicilas/inotify-tools/wiki/#wiki-info
#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
它基本上是即时的 - inotify 是一项内核功能,这些工具利用内核通知特定文件系统事件的哪些请求。