我的autodeploy脚本中有一个奇怪的问题。
基本上这就是php脚本,当通过http触发时,会运行其他shell脚本,其中包含npm install
和npm run build
等几个命令。这一切都有效,除了从http nginx / php-fpm调用php脚本的情况 - 这种情况下npm命令不运行。
我创建了一个简单的示例repo来演示问题:https://github.com/Kasheftin/npm-bug
我们有test.php只运行test.sh shell命令:
<?php
exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log");
我们有test.sh只运行npm run test
命令:
#!/bin/bash
cd /home/www/tests/npm-bug
npm run test
最后,我们使用以下命令获得package.json:
"scripts": {
"test": "echo \"Hello World!\""
}
npm run test
的结果如下:
> npm-bug@1.0.0 test /home/www/tests/npm-bug
> echo "Hello World!"
Hello World!
注意最后一行 - 这是package.json中echo命令的结果。在./test.sh
命令的情况下会出现相同的结果。同样,我们在运行test.log
命令后进入php test.php
。
但是当我从http触发test.php时,我只得到
> npm-bug@1.0.0 test /home/www/tests/npm-bug
> echo "Hello World!"
注意,最后一个字符串不存在,npm命令没有运行。
此外,我在我的nginx中有这个位置规则:
location = /npm-test {
root /home/www/tests/npm-bug;
rewrite ^(.*)$ /test.php break;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
这一切似乎非常标准,nginx和php7.0-fpm开箱即用,php配置对于cli和fpm都是一样的。检查具有不同环境的两台服务器。
答案 0 :(得分:2)
这是一个有趣的问题需要解决。所以当你使用
时就是这样 exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log");
它掩盖了所有错误。你应该像
那样做 exec("/home/www/tests/npm-bug/test.sh > /home/www/tests/npm-bug/test.log 2>&1");
现在你会看到一个很大的错误
npm ERR! Linux 4.4.0-66-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "run" "test"
npm ERR! node v4.2.6
npm ERR! npm v3.5.2
npm ERR! file sh
npm ERR! path sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn sh
npm ERR! npm-bug@1.0.0 test: `sh -c 'echo "Hello World!"'`
npm ERR! spawn sh ENOENT
npm ERR!
npm ERR! Failed at the npm-bug@1.0.0 test script 'sh -c 'echo "Hello World!"''.
npm ERR! Make sure you have the latest version of node.js and npm installed.
我花了一些时间才弄明白为什么。所以我将env语句添加到shell文件
USER=vagrant
PWD=/var/www/html/npm-bug
SHLVL=1
HOME=/home/vagrant
OLDPWD=/home/vagrant/nginx/html/npm-bug
_=/usr/bin/env
正如您所看到的,没有定义PATH变量。这就是问题所在。我在shell脚本中添加了path变量
export PATH=......
我选择了我的终端在echo $PATH
上显示的路径,现在它也可以从fpm开始工作