Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使Linux服务通过Web服务器接受命令?_Php_Linux_Service_Background Process_Background Service - Fatal编程技术网

Php 如何使Linux服务通过Web服务器接受命令?

Php 如何使Linux服务通过Web服务器接受命令?,php,linux,service,background-process,background-service,Php,Linux,Service,Background Process,Background Service,我需要一个应用程序在我的web服务器上后台运行,但我需要能够使用root权限启动/停止应用程序 为了做到这一点,我希望运行一个具有root权限的服务,这样它就可以终止应用程序,并在需要时重新启动它 最后,我需要能够通过Apache/PHP向服务发送start和kill命令,以便通过web间接控制服务 如何创建Linux服务? 如何以这种方式与Linux服务通信 提前谢谢 在PHP脚本中使用exec命令调用shell文件。可以使用“setuser”位设置shell文件,使其作为所有者运行(而不是使

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

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

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

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


提前谢谢

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

当然,您需要非常小心——大量的测试、监视等

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

添加:Re:在Linux中运行服务。这取决于你对Linux的喜好。如果您想确保应用程序服务在失败时会自动重新启动,以及日志记录、签出和运行:


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

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


此外,我还使用sudo规则,以便您可以使用所需的权限运行该特定命令,而无需其他权限。这样会更安全。

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

  • daemon\u name start
  • daemon\u name stop
  • daemon\u name重启
  • deamon\u名称重新加载
启动守护进程应该不难。只要从PHP脚本执行
daemon\u name start
就可以运行它。启动后,可以将进程的PID写入锁文件(用于停止、重新启动或稍后重新加载)。守护进程应该处理信号


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

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

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


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

因此,这里有三个部分:

  • 您的web服务器没有root权限
  • 申请书
  • 监视应用程序的守护程序
您的问题不是启动守护程序,而是编写守护程序,并在不需要root权限的情况下从web服务器与之通信

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

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

  • apache/php向beanstalkd发送一些消息
  • 您的守护进程从beanstalkd读取消息。它根据命令启动或终止或重新加载后台应用程序
您可以用php编写守护程序,因为有

您还可以检查

,正如@shodanex所建议的那样,使用Beanstalkd将是断开web前端与正在运行的根命令行工作程序的连接的一种很好的方法。它可以简单地设置为只运行所需的内容

要运行worker,可以生成并运行一个运行脚本的守护进程,使用start/stop/restart

sudo apt-get install openbsd-inetd

您可以创建所需的服务

而不是setuser位,您可以添加一条规则以允许对/etc/sudoers执行脚本,例如:apache ALL=(root)NOPASSWD:/bin/my.restart.script.sh——然后您只需执行('sudo/bin/my.restart.script.sh')+我同意弗兰克的观点。我认为为特定CMD设置sudoers比设置setuser位要好。此外,sudo还可以记录普通用户(php服务器)调用sudo命令以充当root用户的次数。感谢到目前为止的回复!您知道我将如何与该服务通信吗?不同的linux服务框架具有从服务启动/停止/获取状态的命令。例如“服务foo启动|停止|状态”。Runit使用其“sv”命令:sv start | stop | kill | status foo。您的php程序将执行“sudo sv status foo”并向web用户报告状态。另外,在Fedora(可能还有其他发行版)中,您还需要注释掉sudoers文件中的“Default requirety”一行。是的,我知道,这就是我说“间接”的原因。我只需要start和kill命令,所以我不会传递任何文本命令或任何复杂的命令。身份验证将由PHP前端处理。非常好,我认为这将更加复杂!