我正在尝试从我的服务器上的 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 脚本。你应该:
- 将目录(例如
/var/run/blah...)
硬编码到脚本中的Stop.sh
脚本, - 或者使其相对于脚本的导演 - 您可以使用
dirname $0
在Bash中找到它。 - 或者,不要每次都重写脚本,只需重写进程的
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/