在liunx下经常需要定时执行某些脚本,不可避免用到crontab,而紧随着crontab一系列不启动的问题,网上已经有很多教程。在此,我就讲下用虚拟环境启动xxx.sh文件踩过的坑
1、虚拟环境下运行python
Linux系统中,python需要用到多个版本,如用到pyenv安装python,这样可以保证python之间互不影响。例如我要运行个xxx.py程序,首先进入虚拟环境:
$ pyenv activate env3web
$ python xxx.py
保证python的文件能够执行就ok
2、设置test.sh文件
开始的时候,我的test.sh是这样的:
. ~/.bashrc #设置环境变量的文件
cd /home/jordan #跳转用户目录
pyenv activate env3web #进入虚拟环境
/cnn/pyenv/.pyenv/shims/python python_flask.py >> ./python_flask.log #python程序路径执行相关文件,结果传递到log中
设置好后,直接在linux执行文件,查看是否能够运行 例如:$./home/jordan/test.sh
3、设置crontab
crontab -e
直接编辑要执行的命令,如:
* * * * * /home/jordan/test.sh>>/home/jordan/tt.text
命令表示每分钟执行一次test.sh,这时候突然发现命令能够生成tt.text,但是没有输出任何信息,这时候在linux输入命令:
$/etc/init.d/cron status
可以看到相关信息:
(jordan) CMD (/home/jordan/test.sh>/home/jordan/kk.text )
(CRON) info (No MTA installed, discarding output)
网上找了一下原因,crontab -e模式下执行的命令要加后缀
* * * * * /home/jordan/test.sh>>/home/jordan/tt.text 2>&1
保存再执行后,在tt.text日志中可以看到还是环境变量和路径设置报错,导致test.sh没执行,对此,需要重设环境变量。
因此在linux中输入命令:
set|more
在里面找到LD_LIBRARY_PATH和PATH内容,然后添加之前面的test.sh文件,例如我的test.sh改后如下:
export PATH=/home/jordan/torch/install/bin:/usr/local/cuda-8.0/bin:/cnn/pyenv/.pyenv/shims:/cnn/pyenv/.pyenv/bin:/home/jordan/torch/install/bin:/home/jordan/bin:/home/jordan/.local/bin:/home/jordan/torch/install/bin:/usr/local/cuda-8.0/bin:/cnn/pyenv/.pyenv/shims:/cnn/pyenv/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LD_LIBRARY_PATH=/home/jordan/torch/install/lib:/opt/oracle/instantclient_12_2:/home/jordan/torch/install/lib:
set
cd /home/jordan
pyenv activate env3web
/cnn/pyenv/.pyenv/shims/python python_flask.py >> ./python_flask.log
保存执行后终于成功,这样crontab每分钟能够执行python脚本
另外
由于虚拟环境配置的环境变量比较乱,特地重新安装了linux的虚拟环境,发现脚本不需要那么多环境配置,运行下面shell脚本test.sh就可以进入虚拟环境运行python脚本
export PYENV_ROOT="/cnn/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
cd /home/jordan
pyenv activate env3web
/cnn/pyenv/.pyenv/shims/python python_flask.py >> ./python_flask.log
总结:
由于对linux系统的各种命令还不熟悉,在crontab不能定时执行时,一般来讲都是环境变量和路径设置有问题,这需要我们一个个去排除它。