Php 如何使Linux服务通过Web服务器接受命令?
我需要一个应用程序在我的web服务器上后台运行,但我需要能够使用root权限启动/停止应用程序 为了做到这一点,我希望运行一个具有root权限的服务,这样它就可以终止应用程序,并在需要时重新启动它 最后,我需要能够通过Apache/PHP向服务发送start和kill命令,以便通过web间接控制服务 如何创建Linux服务?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文件,使其作为所有者运行(而不是使
如何以这种方式与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名称重新加载
daemon\u name start
就可以运行它。启动后,可以将进程的PID写入锁文件(用于停止、重新启动或稍后重新加载)。守护进程应该处理信号
在PHP脚本中,您可以调用
守护进程\u name stop
。这将启动一个新的守护进程,该守护进程将检查锁文件并获取正在运行的守护进程的PID,并发送一个将由正在运行的守护进程处理的信号。锁文件应该被删除/清除,然后启动守护程序/进程的stop
可以退出。我认为您应该看看inetd
,它可以配置为运行各种服务,并以root用户身份运行。然后,您可以编写一个相对简单的程序,该程序本身不具有root权限,但由root运行时会执行您需要执行的任务。关于与服务的通信,您没有说明它是什么类型的服务,但是,假设您自己编写,最常见的方法是通过UNIX套接字或MMAP进行通信。这取决于你的需要
哦,是的,应该指出,已经有用于linux系统web管理的应用程序。这是一个非常好的配置,可以根据需要配置为允许尽可能多或尽可能少的控制。因此,这里有三个部分:
- 您的web服务器没有root权限
- 申请书
- 监视应用程序的守护程序
# my_dameon &
我不是php开发人员,但在搜索消息队列和php时,我发现查看第一页上的示例,您似乎可以使用它执行以下操作:
- apache/php向beanstalkd发送一些消息
- 您的守护进程从beanstalkd读取消息。它根据命令启动或终止或重新加载后台应用程序
您还可以检查,正如@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前端处理。非常好,我认为这将更加复杂!