直接输入命令可以执行,但在 cron 不执行?

2016-02-29 20:19:28 +08:00
 Devin
命令如下:
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

请问要怎么解决?
3947 次点击
所在节点    Linux
17 条回复
Bardon
2016-02-29 20:30:39 +08:00
试试在 cron 中打印 PATH 看看路径变量
Lucups
2016-02-29 20:50:56 +08:00
Devin
2016-02-29 21:07:43 +08:00
@Lucups 不是这个的问题,因为我没安装邮件服务端, cron 执行失败就会出现第二条 log ,成功执行则不会
Devin
2016-02-29 21:08:11 +08:00
@Bardon 不是很懂。。。
LoliconInside
2016-02-29 21:14:40 +08:00
1.cron 中的命令最好用全路径,例如 /usr/bin/GET ;
2.最好装个 sendmail 之类的 MTA 服务,看 cron 所在用户的邮件里写的无法执行的原因。
ooxxcc
2016-02-29 21:17:14 +08:00
装个邮件服务端看错误提示

一般不是环境变量就是权限……
Devin
2016-02-29 22:05:29 +08:00
@Bardon
@Lucups
@LoliconInside
@ooxxcc
装了 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
sunsol
2016-03-01 07:40:39 +08:00
环境变量问题,最好单独做成配置文件放在 /etc/cron.d 目录里
配置文件里环境变量想怎么设就怎么设,完全不会影响其他任务
还有告警日志最好把系统默认用邮件配成本地 log
Devin
2016-03-01 07:56:38 +08:00
@sunsol 我是把命令放到 /etc/firewall-test.sh 里面,可以直接顺利执行这个脚本,但是放在 cron 里则不行,要把 iptables 改成 /sbin/iptables 才行,是否.sh 脚本里的命令也要带全路径,才可以在 cron 里执行?
suueyoung
2016-03-01 08:48:17 +08:00
80%觉得是环境变量的锅.
janxin
2016-03-01 09:00:54 +08:00
一般环境变量没有,程序指定全路径
LoliconInside
2016-03-01 12:06:36 +08:00
@Devin 这就对了嘛,懒得指定环境变量的话,直接写全路径就啥事没有了。
qiaoxin
2016-03-02 05:18:48 +08:00
1. crontab -e ,然后在最上面加入 PATH=/bin:/usr/bin 等等。
2. 或者在脚本里面指定 PATH 。
3. 还可以这样* * * * * . /etc/profile && /your/shell.sh
4. 修改 /etc/crontab 中的 PATH 。
qiaoxin
2016-03-02 05:28:41 +08:00
以上方法选择一种就可以了,推荐选择 1>2>3>4
Devin
2016-03-02 10:34:57 +08:00
@qiaoxin 第一条可以,我以前一直以为 cron 里只能加定时任务。。。
yuedingwangji
2016-03-05 01:00:22 +08:00
写了个脚本,手动执行没有任何问题,放到 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 可以试下
gbcbooks
2016-03-21 10:35:45 +08:00
crontab 好用,但也很坑,但坑也就是基环境变量的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX