php - 从 php 执行 bash 脚本来执行 jar

标签 php linux bash shell jar

我正在尝试从我的服务器上的 PHP 运行脚本。

<?php exec("sh /var/www/scripts/script.sh", $output); ?>

我的脚本是:

#!/bin/bash
sh Stop.sh
nohup java -jar RestApiRandonSender.jar&      # You send it in background
MyPID=$!                        # You sign it's PID
echo $MyPID                     # You print to terminal
echo "kill -9 $MyPID" > Stop.sh  
echo "rm Stop.sh" >> Stop.sh

我的文件夹结构是:

/var/www/
/html/restart.php
/scripts/script.sh

所有组和用户都是root

当我从 Chrome 访问 PHP 页面 (localhost/restart.php) 时,没有任何反应。

但是当我在文件夹脚本中并运行时

sudo php ../html/restart.php

脚本重新启动 jar 文件并创建 Stop.sh,但直到我按 Ctrl+c 或 Ctrl+z 后脚本才会结束。

我是 Linux 新手。我希望我提供了所需的所有详细信息..

编辑: 我将 script.sh 中的路径更改为完整文件路径 现在它几乎可以工作了。

这个过程仍然永无止境。 来自chrome的网页正在等待响应,jar文件的进程id与我在Stop.sh中获取的进程id完全不同

$ ps -ef | grep java
apache   10086     1 76 11:23 ?        00:05:00 java -jar /var/www/scripts/RestApiRandonSender.jar 

最佳答案

您当前的问题可能是基于根本不处理目录:rm 与大多数 Unix 式命令一样,如果未指定,则从当前目录进行操作。当您通过调用 ../html/restart.php 从另一个目录运行时,它将尝试在当前目录中运行 Stop.sh 脚本,失败(可能是默默地 - 您应该修复该问题),然后继续运行新的 Java 服务器,我怀疑如果您检查它的日志(您这样做了吗?),它将永久卡在尝试绑定(bind)到 TCP 端口的过程中,但它不能这样做,因为其他进程仍然处于事件状态。

在 Bash 脚本中,您需要处理在哪里查找/创建 Stop 脚本。你应该:

  1. 将目录(例如 /var/run/blah...) 硬编码到脚本中的 Stop.sh 脚本,
  2. 或者使其相对于脚本的导演 - 您可以使用dirname $0在Bash中找到它。
  3. 或者,不要每次都重写脚本,只需重写进程的PID即可。无论如何,这实际上是大多数服务经理所做的事情。您只需将 MyPID(根据您的情况)写入文件,然后执行:

结合最后两个元素,您可以尝试(未经测试):

#!/bin/bash
PIDFILE=$(dirname $0)/PID           # Read the current PID, if any
pid=$(cat $PIDFILE) && kill -9 pid  # Kill it off if it's there
nohup java -jar RestApiRandonSender.jar &
pid=$!
echo $pid > $PIDFILE                # Write the new PID to the file

需要考虑的其他设置问题:

  • 永远不要root 身份运行您的 Web 进程(如果可以避免的话),以确保安全。至少为您需要做的最有限的一组事情设置 sudo 权限。
  • 并发(当几个人同时运行此脚本(URL)时会发生什么?)。您可能会不处理这个问题,因为这通常是一个难题。
  • 重新启动服务器本身时会发生什么。我建议,从长远来看,您考虑从 Java 服务器创建 Linux 服务 - 请参阅 Linux: process into a service举一些例子。这也涉及到上一点......

关于php - 从 php 执行 bash 脚本来执行 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30706038/

相关文章:

php - 查询生成器 : Sum values of a pivot table

PHP 捕获失败的包含

linux - fdisk - 创建一半磁盘大小的交换分区

regex - Linux Shell 脚本 - 正则表达式过滤带有日期的文件名

linux - Bash 压缩脚本

bash - tee 命令创建空文件

PHP 无法加载 php_curl.dll 扩展

php - 使用 php 连接和插入数据到 mysql 表

regex - 如何在 shell 中使用正则捕获这个特定的字符串?

linux - 如何在 Linux 上使 Home/End 功能与 Ctrl 一样