4

我需要一个应用程序在我的 Web 服务器的后台运行,但我需要能够以 root 权限启动/停止应用程序。

为了做到这一点,我希望运行一个具有 root 权限的服务,以便它可以终止应用程序,并在需要时重新启动它。

最后,我需要能够通过 Apache/PHP 向服务发送启动和终止命令,以便可以通过 Web 间接控制它。

如何创建 Linux 服务?
如何以这种方式与 Linux 服务通信?

提前致谢!

4

8 回答 8

6

在 PHP 脚本中使用 exec 命令来调用 shell 文件。可以使用“setuser”位设置 shell 文件,以便它将作为其所有者运行(而不是使用 Web 服务器的权限运行)。

当然,你需要非常小心——大量的测试、监控等。

最后,考虑以专用用户而不是 root 用户身份运行的服务。例如,像 apache 和大多数其他做得好的服务一样。

补充: Re:在 Linux 中运行服务。取决于你的 Linux 风格。如果您想确保您的应用服务在失败时会自动重新启动,加上日志记录,请查看 Runit:

https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

补充:我认为弗兰克建议(在评论中)使用 sudo 系统而不是 setuid 位更好。

于 2009-06-12T02:39:24.360 回答
3

所以,你在这里有三个部分:

  • 没有 root 权限的 Web 服务器
  • 一个应用程序
  • 监控应用程序的守护进程

您的问题不是启动守护程序,而是编写它,并从 Web 服务器与其通信,而不需要 root 权限。

守护进程可以像在后台启动的非交互式应用程序一样简单:

# my_dameon &

我不是 php 开发人员,但是在搜索消息队列和 php 时,我发现了beanstalkd
查看第一页上的示例,您似乎可以使用它来执行以下操作:

  • apache/php 向 beanstalkd 发送一些消息
  • 你的守护进程从 beanstalkd 读取消息。它根据命令启动或杀死或重新加载后台应用程序。

你可以用 php 编写你的守护进程,因为有多种语言的客户端
你也可以检查这个问题

于 2009-06-12T07:42:01.013 回答
1

您可以创建一个接受以下命令的守护程序:

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

启动守护进程应该不难。只需daemon_name start从 PHP 脚本执行即可运行它。启动后,您可以将进程的 PID 写入锁定文件(用于稍后停止、重新启动或重新加载)。守护进程应该处理信号。

在 PHP 脚本中,您可以随后调用daemon_name stop. 这应该会启动一个新的守护进程,它将检查锁定文件并获取正在运行的守护进程的 PID,并发送一个将由正在运行的守护进程处理的信号。应该删除/清除锁定文件,然后stop启动守护程序/进程可以退出。

于 2009-06-12T02:49:26.053 回答
1

我想你应该看一下inetd,它可以配置为运行各种服务,并且它以 root 身份运行。然后,您可以编写一个相对简单的程序,该程序本身不是 root 特权,但当由 root 运行时,它可以完成您需要完成的任务。

于 2009-06-12T02:51:19.060 回答
1

至于与服务通信,您没有说明它是什么类型的服务,但是假设您自己编写它,最常见的方法是通过 UNIX 套接字或 MMAP 进行通信。真的取决于你的需求。

哦,是的,应该指出已经有用于 linux 系统的 web 管理的应用程序。Webmin是一个非常好的工具,可以根据需要进行配置以允许尽可能多的控制。

于 2009-06-12T02:52:29.243 回答
1

正如@shodanex 所建议的那样,使用 Beanstalkd 将是断开 Web 前端与以 root 身份运行的命令行工作者的绝妙方法。它可以简单地设置为只运行所需的内容。

为了运行 worker,Pear 的 System_Daemon可以生成并运行一个守护进程运行脚本,带有 start/stop/restart。

于 2009-10-28T21:16:21.123 回答
0

这样做时要非常非常小心。切勿在 exec 命令中使用任何用户从 Web 提交的数据。这可能允许某人在您的机器上任意执行命令。

另外,我第二次 Frank 使用 sudo 规则,因此您可以使用所需的权限运行该特定命令,但仅此而已。这样会更安全。

于 2009-06-12T02:48:17.570 回答
0

当然与

sudo apt-get install openbsd-inetd

你可以创建你想要的服务

于 2012-05-08T21:26:25.653 回答