通过crontab执行Shell脚本时终端无输出的原因咨询
通过crontab执行Shell脚本时终端无输出的原因咨询
问题场景
- 脚本内容(
myjob.sh):
#!/bin/bash echo Hello i am running $0 at $(date)
- 脚本已设置执行权限:
[abarco@myLinuxVM log]$ ls -lrt /tmp
-rwxrwxr-x. 1 abarco abarco 52 Apr 8 14:29 myjob.sh
- crontab配置:
[abarco@myLinuxVM log]$ crontab -l
38 14 * * * /tmp/myjob.sh
疑问:为什么脚本执行后终端没有显示echo的输出?明明echo应该在终端打印内容的。
问题解答
嗨,这个问题其实是很多刚接触crontab的朋友都会碰到的小坑~
核心原因是:crontab的执行环境和你当前打开的终端会话完全是隔离的。当crontab在后台触发脚本时,它并没有绑定到你正在使用的任何终端窗口——crontab运行在系统的后台上下文里,没有关联的TTY(终端设备),所以echo的输出没有地方可去,默认就会被丢弃(或者发送到系统邮件,取决于系统配置)。
如果你想看到脚本的输出,可以试试这两种实用方法:
- 把输出重定向到日志文件(最推荐的生产级方式)
修改你的crontab条目,把标准输出和错误输出都写到指定日志文件里:
之后你可以通过38 14 * * * /tmp/myjob.sh >> /tmp/myjob.log 2>&1cat /tmp/myjob.log随时查看脚本的执行输出和错误信息。 - 定向输出到指定终端(仅适合临时测试)
先在你想要显示输出的终端里执行tty命令,得到终端的设备路径(比如/dev/pts/0),然后修改脚本里的echo语句:
不过这个方法有局限,如果这个终端窗口关闭了,下次crontab执行脚本时就会失效,所以只适合临时验证脚本是否正常运行。echo Hello i am running $0 at $(date) > /dev/pts/0
备注:内容来源于stack exchange,提问作者luis arturo barco gonzalez
相关产品推荐
相关产品推荐

