当前虚拟化技术盛行,不可避免要使用软链,之前使用公司的PaaS平台,也遇到了软链相关的问题
应用场景
在实例上运行shell脚本,shell进一步调用python脚本
通常我的做法是:
1)将python环境打包上线,目录结构如下:
/home/work
./script
./python2.7.tar.gz
2) 固定写死shell脚本目录和python环境的期望目录结构,如下
./script
|- process.sh
./python2.7
|-bin
|-include
3)在实例启动时解压python2.7.tar.gz到script同一级目录
./script
./python2.7
4)在shell中确定当前目录
cwd=$(cd `dirname $0` && pwd)
3) 然后确定python的目录,启动python脚本
python_path=${cwd}/../python2.7
PATH=${python_path}:${PATH}
python xxx.py
通常情况下这种写法没有问题,我可以正确地找到python
但是,在上线的过程中,script不再是一个真实的目录,而是一个软链
./script -> /home/xxx/xxxx/script
这种时候,我作同样的解压操作,得到如下目录结构:
./script -> /home/xxx/xxxx/script
./python2.7.tar.gz
./python2.7
接下来的操作:
cwd=$(cd `dirname $0` && pwd)
python_path=${cwd}/../python2.7/bin
PATH=${python_path}:${PATH}
python xxx.py
直接报错
python: command not found
看出问题了么?
对!问题出在软链上(查了好久。。。)
pwd
-> /home/work
cd script
cd ..
pwd
-> /home/work
cd 命令中包含软链
没问题啊, script/..
还是当前路径啊,应该能找到 python2.7
目录啊
错!错!错! 尴尬。。
上面的实践并不能说明在 ${cwd}/../python2.7/bin
路径中找到python
原因在于cd
命令的特殊性,cd
会默认跟随软链(follow symbolic link),即软链自身的路径,而不是链接到的目标的路径,但是当我们查看软链或者包含软链的路径下的内容时,系统会自动定位软链链接的目标路径,也就是
ls script/..
-> xxxx (IS this)
-> python2.7.tar.gz python2.7/ (NOT this)