这是bash脚本:
#!/bin/bash
echo "$NODE_ENV"
(
echo $USER;
echo $PATH;
cd /opt/chat-staging/;
git pull;
NODE_ENV=staging;
echo "Set NODE_ENV to $NODE_ENV";
node leaderboard.js & node app.js;
echo "Started leaderboard.js";
echo "Started app.js";
)
echo "NODE_ENV is now $NODE_ENV"
这是PHP脚本:
<?php
exec('/bin/bash /opt/chat-staging/start_app.sh 2>&1', &$output, &$return_var);
print_r($output);
print $return_var;
?>
我把它设置为github post-commit钩子,但这是输出:
数组([0] =&gt; [1] =&gt; www-data [2] =&gt; / usr / bin [3] =&gt; / usr / lib / git-core / git-sh-setup:90:sed:not found [4] =&gt;基本名称: 写入错误:管道损坏[5] =&gt; / usr / lib / git-core / git-sh-setup:212: uname:未找到[6] =&gt;主机密钥验证失败。 [7] =&gt;致命: 远程端意外挂断[8] =&gt;将NODE_ENV设置为分段[9] =&GT; /opt/chat-staging/start_app.sh:line 11:node:command not found [10] =&gt; /opt/chat-staging/start_app.sh:line 11:node:command not 发现[11] =&gt;已启动leaderboard.js [12] =&gt;已开始app.js [13] =&gt; NODE_ENV现在是0
/ opt / chat-staging /归“www-pub”所有;在/ etc / groups中,我有“www-pub:x:1000:www-data,root”。
那为什么这不起作用?我甚至在/var/www/.ssh/id_rsa中有一个RSA密钥,并且公钥作为GitHub部署密钥添加。
编辑,附录
我添加了一个git remote-v;在“git pull”之前的剧本。
root@li70-243:/opt/chat-staging# su - www-data
$ bash /opt/chat-staging/start_app.sh
origin git@github.com:zackster/CompassionPit--Node-.git (fetch)
origin git@github.com:zackster/CompassionPit--Node-.git (push)
Already up-to-date.
然而我仍然看到PHP输出像......
数组([0] =&gt;来源git@github.com:zackster/CompassionPit - Node-.git (获取)[1] =&gt; origin git@github.com:zackster/CompassionPit - Node-.git (推)[2] =&gt; master [3] =&gt; *声誉[4] =&gt; / usr / lib / git-core / git-sh-setup:90:sed:not found [5] =&gt;基本名称: 写入错误:管道损坏[6] =&gt; / usr / lib / git-core / git-sh-setup:212: uname:未找到[7] =&gt; / usr / lib / git-core / git-pull:244:sed:not 发现[8] =&gt;您的配置指定与ref合并 '声誉'[9] =&gt;来自遥控器,但没有提到这样的参考。
答案 0 :(得分:4)
您的PHP脚本似乎运行正常。什么不是“正常工作”是exec()
。您希望将PATH
环境变量设置为常规shell用户设置的任何值。它不是。您需要为bash脚本(以及其中的工具)设置环境。
在您的 shell中执行echo $PATH
并将其添加到您的执行人员中:
exec('export PATH=/usr/bin:/usr/local/bin:/some/other/paths && /bin/bash /opt/chat-staging/start_app.sh 2>&1', &$output, &$return_var);
再次尝试使用您的脚本。您还可以将PATH移动到shell脚本中。你甚至可以复制你的 .bashrc(或.bash_profile或其他)并用source …/.bashrc
加载它。
而不是exec()
您还可以查看proc_open(),您可以更好地控制要执行的流程。
github解释了如何挂钩发布接收事件:http://help.github.com/post-receive-hooks/