因为工作需要,打算将一台服务器上运行的一组程序迁移到另外一台服务器上。程序运行在virtualenv环境下,正常的方式是在目标服务器上安装设置virtualenv环境、安装依赖库、迁移程序,比较麻烦。
(图源 :pixabay)
于是我就想,既然virtualenv环境下的东西都已经包含在对应目录内,那么我直接把整个目录的内容复制到目标服务器上是否可行了,如果可以,就省事多啦。
想来想去,不如一试,撸起袖子直接干吧。
首先在目标服务器上建好用户:abcd1111,然后使用scp
指令将原来服务器对应用户目录内的所有数据复制过来。
然后使用source ~/venv/bin/activate
激活环境,发现能正常进入到virtualenv环境。
执行一下python
指令,却提示我:
Command 'python' not found, but can be installed with:
虽然python3
可以用,但是执行我的程序却提示找不到依赖库:
ModuleNotFoundError: No module named 'xxxxx'
这肯定不对,和在原来环境下执行的效果不一样,我首先想到的就是环境变量的问题,看一下环境变量:
echo $PATH
显示如下:
/home/abcd1234/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
这很明显不对,因为abcd1234
是原来服务器上的目录,新服务器上目录名为abcd1111
。
环境变量是哪里引进的呢,我看一下~/venv/bin/activate
内容,其中包含如下片段:
VIRTUAL_ENV="/home/abcd1234/venv"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
我觉得把上述代码中abcd1234
修改为abcd1111
就应该能用了,不过安全起见,我看看bin目录中是否有别的文件应用到abcd1234
这个目录名:
grep -r "abcd1234" ./
嚯,一查还一大堆:
那么只改~/venv/bin/activate
可能就会有一些意想不到的问题,安全的做法是将~/venv/bin/
目录中所有文件中的abcd1234
修改为abcd1111
。
这时候,又是需要sed
闪亮登场了,执行如下命令:
sed -i "s/abcd1234/abcd1111/g" `grep -rl "abcd1234" ./`
然后再去查看一下文件内容,grep -r "abcd1111" ./
,可以看到都已经换成abcd1111
啦:
重新登录,激活环境,然后发现无论是直接敲python
进入到python环境还是直接执行我的各种脚本都没有任何问题,如丝般顺滑......