我正在尝试从服务器上的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
答案 0 :(得分:0)
您当前的问题可能基于根本不处理目录:rm
与大多数Unix-esque命令一样,如果没有指定,则从当前目录操作。当你通过调用../html/restart.php
从另一个目录运行时,它将尝试在当前目录中运行Stop.sh
脚本,失败(可能很默默 - 你应该修复它),然后继续运行新的Java服务器,我怀疑如果你检查它的日志(你有没有这样做?)将永久地试图绑定到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
,如果您可以避免它,为了安全起见。至少为您需要做的最有限的事情设置sudo
权限。