前因:
使用mysqldump对mysql 每天定时备份。
备份执行文件mysql_dump.sh:
#!/bin/bash
docker exec -it mysql mysqldump -uroot -p123456 cx | gzip > /opt/mysql/backup/cx_`date +%Y%m%d`.sql.gz
send=`date '+%Y-%m-%d %H:%M:%S'`
if [ $? -ne 0 ];
then
echo "$send 数据备份失败"
exit -1
else
echo "$send 数据备份成功!"
fi
find /opt/mysql/backup/ -mtime +7 -name 'cx_[1-9].sql' -exec rm -rf {} \;
Linux定时任务:
#每周日凌晨2点
00 02 * * 7 sh /opt/mysql/backup/mysql_dump.sh > /opt/mysql/backup/mysql_dump.log 2>&1
仔细看我们可以发现如果在为创建crontab的情况下,直接执行mysql_dump.sh,是可以正常执行的。创建crontab后,执行定时任务,会提示the input device is not a TTY!命名sh文件可以正常执行,并正常输出结果,但是为什么定时任务会无法执行呢?why?
后果:
the input device is not a TTY
溯源;
作为一个小白的我,经过多方查找资料并测试发现,只要把-it去掉即可。
docker exec mysql mysqldump -uroot -p123456 cx | gzip > /opt/mysql/backup/cx_`date +%Y%m%d`.sql.gz
那这是为什么呢?
linux执行定时任务的时候没有终端设备,TTY一词源于Teletypes,或teletypewriters。其实出现该错误和我们的一个习惯有关,一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数,而在定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。
承上: