技术解析

直接输入命令可以执行,但在 cron 不执行?
0
2021-07-05 02:32:06
idczone
命令如下:
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A OUTPUT -j LOG --log-prefix "[IPTABLES OUTPUT] " --log-level 7

直接输入可以无误执行,但把脚本放在 cron 里
0 0 * * * bash /etc/firewall-test.sh

syslog 有记录,但不执行, log 如下
(root) CMD (bash /etc/firewall-test.sh)
(CRON) info (No MTA installed, discarding output)

若把命令改成下面这样,顺利执行,应该是上面的命令出问题
echo 9999 >> /etc/cronlog

请问要怎么解决?
试试在 cron 中打印 PATH 看看路径变量

https://www.baidu.com/s?ie=UTF-8&wd=No%20MTA%20installed
http://www.pooy.net/ubuntu-open-crontab-logging-and-resolution-no-mta-installed-discarding-output-problem.html

不是这个的问题,因为我没安装邮件服务端, cron 执行失败就会出现第二条 log ,成功执行则不会

不是很懂。。。

1.cron 中的命令最好用全路径,例如 /usr/bin/GET ;
2.最好装个 sendmail 之类的 MTA 服务,看 cron 所在用户的邮件里写的无法执行的原因。

装个邮件服务端看错误提示
一般不是环境变量就是权限……





装了 exim4 ,查看日志 cat /var/mail/mail 如下
/etc/firewall-locked.sh: line 1: iptables: command not found
/etc/firewall-locked.sh: line 2: iptables: command not found
/etc/firewall-locked.sh: line 3: iptables: command not found
/etc/firewall-locked.sh: line 4: iptables: command not found
/etc/firewall-locked.sh: line 5: iptables: command not found
/etc/firewall-locked.sh: line 6: iptables: command not found
/etc/firewall-locked.sh: line 7: iptables: command not found
命令改成如下,顺利执行
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -A OUTPUT -j LOG --log-prefix "[IPTABLES OUTPUT] " --log-level 7

环境变量问题,最好单独做成配置文件放在 /etc/cron.d 目录里
配置文件里环境变量想怎么设就怎么设,完全不会影响其他任务
还有告警日志最好把系统默认用邮件配成本地 log

我是把命令放到 /etc/firewall-test.sh 里面,可以直接顺利执行这个脚本,但是放在 cron 里则不行,要把 iptables 改成 /sbin/iptables 才行,是否.sh 脚本里的命令也要带全路径,才可以在 cron 里执行?

80%觉得是环境变量的锅.

一般环境变量没有,程序指定全路径

这就对了嘛,懒得指定环境变量的话,直接写全路径就啥事没有了。

1. crontab -e ,然后在最上面加入 PATH=/bin:/usr/bin 等等。
2. 或者在脚本里面指定 PATH 。
3. 还可以这样* * * * * . /etc/profile && /your/shell.sh 。
4. 修改 /etc/crontab 中的 PATH 。

以上方法选择一种就可以了,推荐选择 1>2>3>4

第一条可以,我以前一直以为 cron 里只能加定时任务。。。

写了个脚本,手动执行没有任何问题,放到 crontab 下执行就不行,百度了一堆,还是懵懂,初步得出结论和解决方法。
导致 crontab 不执行的原因主要是 脚本里面设置了自定义变量。
解决方法:
脚本开头添加 source /etc/profile
export 添加的自定义变量

当手动执行脚本 OK ,但是 crontab 死活不执行时,很可能是环境变量惹的祸,可尝试在 crontab 中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh 网上找的,实测可用, lZ 可以试下

crontab 好用,但也很坑,但坑也就是基环境变量的问题

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服