我用的是dbmaker数据库,在命令行执行,./dmserver dbtest,这个时候返回数据库启动成功的一些信息,同时返回命令行。在脚本中执行也是ok的。我把dbtest用参数来表示,用php传递数据库名称,来执行,php中的文句如下:
<?php
$db_name="dbtest"
$result=exec("./start_db.sh $db_name");
echo $result;
?>
shell脚本如下:
#!bin/bash
db_name=$1
cd /home/dbmaker/db
./dmserver $db_name
改成这个样子之后,在命令行中执行php start_db.php,结果没有显示,且不返回命令行,如图:在shell的最后加上一行“echo 0",同样的结果,啥也没有。在进程中查看,这个数据库已经启动了,在后台有四个进程,而当用CTRL+C跳出时,数据库的进程只有三个了,少了一个。感觉应该是php调用的问题,因为直接执行脚本都是ok的,可以返回成功信息,且跳回命令行。phpshell数据库

解决方案 »

  1.   

    ./start_db.sh $db_name &看看后台运行呢。
      

  2.   

    确实是在后台运行的,通过 ./start_db.sh "dbtest"来执行脚本,运行是ok的,运行之后可以返回启动信息,后面加上echo语句也可以正常运行,跳转回命令行。可用php来调用的时候就不行了,虽然后台的进程也在运行,可没有显示任何信息,echo语句也不会执行,且不跳转回命令行。
      

  3.   

    养成好习惯,查看返回值不要用echo ,用var_dump或者var_export,如果cli模式不能执行,走一下web端看下结果,再不行就改一下shell只返回一个值,看看能不能接收,看你这情况貌似是卡在exec这一句,也就是你执行的shell没有执行完成,所以卡住
    另外,你的shell就一句话你非要写成3行,而且实现这个功能要shell干啥?直接exec("/home/dbmaker/db/dmserver $db_name");就好了
      

  4.   

    这几句只是shell中的一部分,将shell中其他的部分排除掉,最终确定问题出在了这一个语句上。当dmserver执行失败的时候,这个脚本可以返回失败的讯息。可执行成功时却不会,就会像一楼的图示一样,也不会退出命令行,后续的命令也不会执行。现在可以确定的是,命令执行成功,感觉像是后台启动的命令改为了在前端启动。而直接用脚本执行就正常了。只有在用php去调用的时候才会出现这种情况。 
      

  5.   

    这几句只是shell中的一部分,将shell中其他的部分排除掉,最终确定问题出在了这一个语句上。当dmserver执行失败的时候,这个脚本可以返回失败的讯息。可执行成功时却不会,就会像一楼的图示一样,也不会退出命令行,后续的命令也不会执行。现在可以确定的是,命令执行成功,感觉像是后台启动的命令改为了在前端启动。而直接用脚本执行就正常了。只有在用php去调用的时候才会出现这种情况。 
    如果是一段不要加#!bin/bash头
    试下在./dmserver $db_name之前返回,能否接收到正确的返回值?如果可以,看一下dmserver 这个启动脚本,是不是存在问题,没有返回或者没有结束,并且看看你传的参是否正确,一步一步调吧
      

  6.   

    嗯,一步步调过了,最终确定问题是在php调用上,因为在加上php来调用后,就出现了这个问题。是不是因为php调用对线程有什么影响造成的。参数的传递也ok,执行也是正确的,可以没有返回信息,也不会执行接下来的代码了。dmserver是用来启动数据库的,脚本执行后,查看进程,可以看出数据库正常启动了,可卡在这一句上了。