首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从php执行bash脚本以执行jar

从php执行bash脚本以执行jar
EN

Stack Overflow用户
提问于 2015-06-08 17:52:51
回答 1查看 358关注 0票数 0

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

代码语言:javascript
复制
<?php exec("sh /var/www/scripts/script.sh", $output); ?>

我的脚本是:

代码语言:javascript
复制
#!/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

我的文件夹结构是:

代码语言:javascript
复制
/var/www/
/html/restart.php
/scripts/script.sh

所有组和用户都是root

当我从Chrome (localhost/restart.php)访问PHP页面时,什么也没有发生。

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

代码语言:javascript
复制
sudo php ../html/restart.php

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

我是Linux的新手。我希望我给出了所有需要的细节..

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

这个过程永远不会结束。来自chrome的网页正在等待响应,jar文件的进程id与我在Stop.sh中获得的进程id完全不同。

代码语言:javascript
复制
$ ps -ef | grep java
apache   10086     1 76 11:23 ?        00:05:00 java -jar /var/www/scripts/RestApiRandonSender.jar 
EN

回答 1

Stack Overflow用户

发布于 2015-06-08 18:08:28

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

在您的Bash脚本中,您需要处理在何处查找/创建停止脚本。您应该:

  1. 硬编码目录(例如,/var/run/blah...)到脚本中的Stop.sh脚本,
  2. 或使其相对于脚本的导演-您可以使用dirname $0在Bash.
  3. 中找到这一点,或者,不要每次都重写脚本,只需重写进程的<Stop.sh>d12>。这实际上是大多数服务管理器都会做的事情。在本例中,您只需将MyPID写入文件,然后执行该命令:

将最后两个元素组合在一起,您可以尝试(未测试):

代码语言:javascript
复制
#!/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

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

  • Never为了安全起见,如果可以避免,请以root身份运行您的web进程。至少要为do.
  • concurrency所需的最有限的内容设置sudo权限(当多个人同时运行此脚本时会发生什么情况?)你可以不处理这个问题,因为这是一个很难解决的问题,当你重新启动服务器时,usually.
  • What就会发生。我建议,从长远来看,您可以考虑在您的Java服务器之外创建一个Linux服务--有关示例,请参阅Linux: process into a service。这也涉及到前一点……
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30706038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档