公司业务是做机票爬虫,想管理在各个地方的爬虫主机,有些是云主机带公网ip,有些是在adsl背后的一些普通机子。 我们通过openresty启动一个privileged agent process,在这个守护进程中不断的发送自己主机的状态给服务器和接受我们定义好的一些命令来执行一些爬虫的管理,这其中用到了lua-resty-shell。 在使用的过程中发现其识别不了~,以及没有对应的环境变量;与之对应的我们自己测试的时候用resty可以。
resty -e 'ngx.print(os.getenv("HOME")); ngx.sleep(3000)'
~ % cd /tmp/resty_tKoFSaBJyA/
/tmp/resty_tKoFSaBJyA % cat conf/nginx.conf
daemon off;
master_process off;
worker_processes 1;
pid logs/nginx.pid;
env CFLAGS;
env DYLD_LIBRARY_PATH;
env EDITOR;
env FTPCRED;
env FTPURL;
env GITLAB_TOKEN;
env GOPATH;
env GREP_OPTIONS;
env HISTFILESIZE;
env HISTSIZE;
env HOME;
env HOMEBREW_NO_AUTO_UPDATE;
env JAVA_HOME;
env JENKINS_URL;
env LANG;
env LDFLAGS;
env LOGNAME;
env LSCOLORS;
env LUA_CPATH;
....
通过查看resty执行脚本的时候配置文件,发现其加载了很多环境变量,于是我们把这部分加到我们的配置文件中,shell脚本工作正常。
在阅读文档的时候,发现已经有对应的描写
Since by default, Nginx does not pass along the PATH system environment variable, you will need to configure the env PATH directive if you wish for it to be respected during the searching of sub-processes:
env PATH;
...
content_by_lua_block {
local ngx_pipe = require "ngx.pipe"
local proc = ngx_pipe.spawn({'ls'})
}