我正在尝试从我的服务器上的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 发布于 2015-06-08 18:08:28
您当前的问题可能是因为根本不处理目录:rm与大多数Unix-esque命令一样,如果没有指定任何目录,则从当前目录操作。当您通过调用../html/restart.php从另一个目录运行时,它将尝试在当前目录中运行Stop.sh脚本,失败(可能会静默失败-您应该修复它),然后继续运行新的Java服务器,如果您检查它的日志,我怀疑这一点(您这样做了吗?)将永久地尝试绑定到TCP端口,但它不能这样做,因为另一个进程仍然处于活动状态。
在您的Bash脚本中,您需要处理在何处查找/创建停止脚本。您应该:
/var/run/blah...)到脚本中的Stop.sh脚本,dirname $0在Bash.Stop.sh>d12>。这实际上是大多数服务管理器都会做的事情。在本例中,您只需将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进程。至少要为do.sudo权限(当多个人同时运行此脚本时会发生什么情况?)你可以不处理这个问题,因为这是一个很难解决的问题,当你重新启动服务器时,usually.https://stackoverflow.com/questions/30706038
复制相似问题