数日前遇到BUG,crontab定时执行的脚本中有一个脚本没效果,但是putty登录服务器后手动执行同样的脚本,就有效果,很诡异。 后来一次直接在定时任务中执行sudo 拷贝文件,结果完全没效果。同样的命令手动执行又可以。于是,引发了我的思考。看来多次出现定时任务中脚本执行无效的是因为脚本中通过sudo来执行命令。口说无凭,还是走个例子来验证下。
先准备了一个生成文件的脚本,代码如下:
#!/bin/bash
#Program:
# Program mkfile by current minutes and seconds, e.g: 2247.txt
# Then copy the file to /root/ direcotry
#History
# 2017/04/07 Hack First release
cd /home/hack/demo
filename=`date "+%M%S"`.txt
touch $filename
sudo cp ./$filename /root/
手动执行脚本会让你输入当前用户密码。当前用户为hack 有sudo权限。
执行后会在当前目录生成一个文件。并且拷贝一份到/root目录。
接下来在Crontab中执行mkfile.sh这个脚本,并将执行日志输出到mkfile.log中。
每两分钟执行一次。
登了几分钟后发现,当前目录生成了文件,但是/root/目录下没有文件。
执行日志mkfile.log文本如下:
大概意思是sudo 需要在控制终端中才能执行。
在etc/sudoers中将下图框出的那一行注释掉,
也就是说让sudo不一定非要在终端才能执行。但是过了几分钟,/root/下还是没有文件。
想到在手动执行sudo的时候需要输入当前用户的密码才行。crontab 又不会输入密码。于是。
在ALL前面加了NOPASSWD后,过了几分钟终于在/root/下看到拷贝过去的文件了。
注意:无论是注释掉 requiretty 还是 加NOPASSWD 都是不怎么安全的操作。此文只是用于解释crontab sudo 为什么执行无效。
如果业务需求定时任务中需要用到root权限的,还是直接用root用户的crontab 开定时任务吧。