如何制作一个通过Web服务器接受命令的Linux服务?

时间:2009-06-12 02:34:40

标签: php linux service background-process background-service

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

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

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

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

提前致谢!

8 个答案:

答案 0 :(得分:6)

使用PHP脚本中的exec命令来调用shell文件。 shell文件可以使用“setuser”位设置,因此它将作为其所有者运行(而不是使用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

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

答案 1 :(得分:3)

所以,你在这里有三件事:

  • 您的没有root权限的网络服务器
  • 申请
  • 正在监控应用程序的守护程序

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

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

# my_dameon &

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

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

你可以在php中编写你的守护进程,因为有client in many languages
您还可以查看this question

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

哦,是的,应该指出已有Linux系统的Web管理应用程序。 Webmin是一个非常好的版本,可以根据需要进行配置,以实现尽可能多的控制。

答案 5 :(得分:1)

正如@shodanex建议的那样,使用Beanstalkd将是一个很好的方法来断开web-front-end与run-as-root命令行工作者的连接。它可以简单地设置为只运行所需的。

要运行worker,Pear's System_Daemon可以使用start / stop / restart生成并运行一个运行守护程序的脚本。

答案 6 :(得分:0)

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

此外,我第二个Frank使用sudo规则,因此您可以使用您需要的权限运行该特定命令,但没有别的。这样会更安全。

答案 7 :(得分:0)

当然有

sudo apt-get install openbsd-inetd

您可以创建自己想要的服务