我有一个特定的脚本,它获取特定MAC的D1地址。为此,它使用了arp,并且工作正常。当我编写一个crontab来运行该脚本时,问题就出现了;它运行良好并运行,但是它运行arp命令的行不起作用,因此,只有在从crontab运行时,脚本才能正确完成。
剧本是:
#!/bin/bash
subred=192.168.1.0/24
mac=aa:bb:cc:dd:ff:gg
log() {...}
log info "Init program"
ip=$(nmap -sP $subred >/dev/null && arp -an | grep $mac | awk '{print $2}' | sed 's/[()]//g')
if [ $ip ]; then
log ok "IP found in $ip"
else
log error "IP not found"
fi
log info "Finished program"此脚本已配置为每小时在crontab上使用@hourly /root/machaunter.sh运行一次。cron中的时间调度工作做得很好,脚本运行也很顺利,排除了权限或脚本问题。它们的证据是它生成的日志文件:
29/04/2020 14:00:01 Init program
29/04/2020 14:00:06 IP not found
29/04/2020 14:45:59 Init program
29/04/2020 14:46:08 IP found in 192.168.1.173
29/04/2020 14:46:09 Finished program
29/04/2020 15:00:01 Init program
29/04/2020 15:00:10 IP not found
29/04/2020 16:00:01 Init program
29/04/2020 16:00:13 IP not found
29/04/2020 17:00:01 Init program
29/04/2020 17:00:07 IP not found
29/04/2020 18:00:01 Init program
29/04/2020 18:00:05 IP not found
29/04/2020 18:25:43 Init program
29/04/2020 18:25:50 IP found in 192.168.1.173
29/04/2020 18:25:51 Finished program正如你所看到的,我两次手动运行脚本是正确的,但是“纽约时报”的其他人却没有。
我一直在调试并添加到脚本测试中,直到我发现,在arp调用中没有显示任何内容,但是当我手动启动它时(为了执行测试,我添加了log error "arp: $(arp -an)"日志并将crontab更改为每分钟运行一次* * * * /root/machaunter.sh)
30/04/2020 09:22:01 Init program
30/04/2020 09:22:01 arp:
30/04/2020 09:23:01 Init program
30/04/2020 09:23:01 arp:
30/04/2020 09:24:02 Init program
30/04/2020 09:24:02 arp:
30/04/2020 09:24:29 Init program
30/04/2020 09:24:29 arp: Address HWtype HWaddress Flags Mask Iface 192.168.1.46 ether 7e:2d:d1:ca:d9:c0 C br0 192.168.1.68 ether c894:66:dd:1c:c2:9d C br0 192.168.1.173 ether 48:48:59:e5:b8:5e C br0 192.168.1.1 ether bf:f1:54:4d:e3:25 C br0
30/04/2020 09:25:01 Init program
30/04/2020 09:25:01 arp:
30/04/2020 09:26:01 Init program
30/04/2020 09:26:01 arp:
30/04/2020 09:27:01 Init program
30/04/2020 09:27:01 arp:
30/04/2020 09:28:01 Init program
30/04/2020 09:28:01 arp:
30/04/2020 09:29:02 Init program
30/04/2020 09:29:02 arp:
30/04/2020 09:30:01 Init program
30/04/2020 09:30:01 arp:
30/04/2020 09:31:01 Init program
30/04/2020 09:31:01 arp:从日志中可以看出,arp命令永远不会返回数据,除非是我手动启动的唯一一次。此外,正如您在调用此命令时所看到的,该命令不会终止脚本(我们没有Finished program日志)
为什么会发生这种情况?会有什么解决办法呢?
带有CRON日志的UPDATE
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-04-27 18:09:19 UTC; 2 days ago
Docs: man:cron(8)
Main PID: 486 (cron)
CGroup: /system.slice/cron.service
└─486 /usr/sbin/cron -f
Apr 30 10:40:01 NanoPi-R1 CRON[14428]: (root) CMD (/root/machaunter.sh)
Apr 30 10:40:01 NanoPi-R1 CRON[14429]: (root) CMD ( /bin/bash /usr/bin/sync_ntp_rtc.sh /dev/rtc0)
Apr 30 10:40:01 NanoPi-R1 CRON[14421]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:40:01 NanoPi-R1 CRON[14421]: pam_unix(cron:session): session closed for user root
Apr 30 10:40:04 NanoPi-R1 CRON[14420]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:40:04 NanoPi-R1 CRON[14420]: pam_unix(cron:session): session closed for user root
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: pam_unix(cron:session): session opened for user root by (uid=0)
Apr 30 10:41:01 NanoPi-R1 CRON[14463]: (root) CMD (/root/machaunter.sh)
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: pam_unix(cron:session): session closed for user rootUPDATE使用命令的STDOUT添加了XXXX重定向到crontab命令>/tmp/logfile 2>&1,滞后:
* * * * * /root/machaunter.sh >/tmp/logfile 2>&1在/tmp/logfile中我得到:
30/04/2020 13:52:01 [info] Init program
/root/machaunter.sh: line 37: arp: command not found
30/04/2020 13:52:01 [info] arp:发布于 2020-04-30 14:00:30
与普通的交互环境相比,cron运行脚本的环境对于PATH变量具有不同的值。
这意味着您的脚本不知道在哪里可以找到arp命令,例如(如评论中所述)。
我建议您通过在交互式shell中为每个目录运行command -v,在脚本中使用的工具是哪些目录。
command -v nmap
command -v arp等。
这将给出这些命令的路径名列表。获取这些目录名,并将它们添加到脚本本身中的PATH中(在脚本开头的某个地方):
PATH=$PATH:/some/directory/path:/another/directory/path在脚本中这样做可以保证脚本将找到该工具。
最后,您可能只需要添加/usr/sbin:
PATH=$PATH:/usr/sbin另一种选择是使用这些工具的绝对路径,比如使用/usr/sbin/arp而不仅仅是arp。
发布于 2021-10-22 00:41:53
要在crontab中运行D1脚本,必须使用arp路径而不是arp,因为默认情况下,crontab运行位于/bin中的脚本,而arp位于/sbin/中。
https://unix.stackexchange.com/questions/583516
复制相似问题