从网站启动/停止程序

从网站启动/停止程序

我的机器上有一些用户,我允许他们运行小型 Mumble 语音服务器。我希望他们能够从网站(由 Apache 运行)启动/停止他们的语音服务器。在当前设置下,我将每个服务器作为不同的用户(该人的特定用户帐户)运行。

我不知道的是立即启动/停止服务器的最佳方法。目前,每当网站想要启动/停止服务时,我都会在数据库中输入一个条目。然后,我有一个 cron 脚本,它每分钟运行一次,在数据库中查找这些启动/停止。该 cron 脚本将切换到用户帐户并以该用户身份运行服务器。我的问题是,该操作可能需要大约 1 分钟才能发生。

有没有更灵敏的方法来实现这一点?

答案1

除了写入数据库之外,您是否考虑过写入命名管道?您可以为每个用户创建一个命名管道,然后创建一个进程来监视每个命名管道。当“重新启动”命令到来时,立即重新启动该进程。

这不是一个完整的解决方案,可以改进,但它应该让您了解如何监视命名管道并重新启动进程。

while read line <$pipe
 do
  if [[ "$line" == 'restart' ]]; then
    restart_some_service
  fi
done

答案2

这可能有点过头了,但你有没有考虑过用户分钟?他们列出了一个流程插件标准插件,让您的用户

查看系统上运行的所有进程,杀死属于[它们]的进程,并启动新的进程。

从来没有尝试过这个,只是觉得它可能很漂亮,嗯,“专业”。)

编辑 关于“Mumble”,似乎有已经有一些网络界面,但我不知道它们是否对您的情况有帮助。)

答案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 是一项内核功能,这些工具利用内核通知特定文件系统事件的哪些请求。

相关内容