crontab中引入环境变量
概述
crontab 中默认使用的环境变量有限,导致定时任务中执行的脚本,会找不到命令。在执行的脚本中导入当前用户的环境变量可以解决问题。
添加方式
脚本中添加环境变量的方式如下:
1 | . /etc/profile |
我这里使用了第一种。
crontab 中默认使用的环境变量如下:
1 | /usr/bin:/bin |
脚本中添加用户环境变量后,变为:
1 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
2>&1
使用
排查问题的过程中使用了2>&1
,很关键。问题现象是,route > log.txt
手动执行后,文件有内容,放到定时任务中只生成文件但是没有内容。
直到加入了2>&1
才看到错误信息:找不到route
命令,进而想到是环境变量的问题。这部分内容转自 https://www.cnblogs.com/yangyongzhi/p/3364939.html
相关知识
- 默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |)。
- 默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes `)。
- 默认地,标准的错误输出到终端,但是也可以重定向到文件。
- 标准的输入,输出和错误输出分别表示为
STDIN
,STDOUT
,STDERR
,也可以用0,1,2来表示。 - 其实除了以上常用的3中文件描述符,还有3~9也可以作为文件描述符。3~9你可以认为是执行某个地方的文件描述符,常被用来作为临时的中间描述符。
- 实例:
1 | command 2>errfile # command的错误重定向到文件errfile。 |
“2>&1 file”和 “> file 2>&1”区别
1 | cat food 2>&1 >file #错误输出到终端,标准输出被重定向到文件file。 |
注意
通常打开的文件在进程推出的时候自动的关闭,但是更好的办法是当你使用完以后立即关闭。用m<&-
来关闭输入文件描述符m
,用m>&-
来关闭输出文件描述符m
。如果你需要关闭标准输入用<&-
, >&-
被用来关闭标准输出。
同时输出到终端和文件
1 | copy source dest | tee.exe copyerror.txt |
参考
- http://docstore.mik.ua/orelly/unix/upt/ch45_21.htm
- http://www.unix.com/shell-programming-scripting/34011-meaning-dev-null-2-1-a.html
- http://docstore.mik.ua/orelly/unix/upt/ch08_13.htm
附
脚本内容如下:
1 |
|