从php执行一个bash脚本来执行jar

时间:2015-06-08 09:52:51

标签: 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(localhost/restart.php)访问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 

1 个答案:

答案 0 :(得分:0)

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

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

  1. 对目录进行硬编码(例如/var/run/blah...)到脚本中的Stop.sh脚本,
  2. 或相对于脚本的导演 - 您可以使用dirname $0在Bash中找到它。
  3. 或者,不要每次都重写脚本,只需重写该过程的PID即可。这实际上是大多数服务经理所做的事情。在这种情况下,您只需将MyPID写入文件,然后执行:
  4. 结合最后两个元素,您可以尝试(未经测试):

    #!/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,如果您可以避免它,为了安全起见。至少为您需要做的最有限的事情设置sudo权限。
    • 并发(当多个人一次运行此脚本(URL)时会发生什么?)。你可能会因为没有处理这个问题而侥幸成功,因为这通常是一个难题。
    • 重启服务器本身会发生什么。我建议,从长远来看,您将考虑从Java服务器创建Linux服务 - 有关示例,请参阅Linux: process into a service。这也涉及前一点......