我有一个特定的脚本来获取IP
特定的地址MAC
。为此,它使用arp
,并且工作正常。当我编写 a 程序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 守护进程日志更新
● 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 root
使用命令标准输出更新
我已将 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:
答案1
PATH
与普通的交互式环境相比,cron 运行脚本的环境具有不同的变量值。
这意味着您的脚本不知道在哪里arp
可以找到该命令,例如(正如评论中提到的)。
我建议您通过command -v
在交互式 shell 中运行每个工具来记下您在脚本中使用的工具的目录,例如
command -v nmap
command -v arp
ETC。
这将为您提供这些命令的路径名列表。获取这些目录名称并将它们添加到PATH
脚本本身中(在脚本开头的某个位置):
PATH=$PATH:/some/directory/path:/another/directory/path
在脚本中执行此操作可保证脚本能够找到该工具。
最后,您可能只需要添加/usr/sbin
:
PATH=$PATH:/usr/sbin
另一种选择是使用工具及其绝对路径,例如使用/usr/sbin/arp
而不只是arp
.
答案2
要arp
在 中运行脚本crontab
,需要使用arp
路径 as/sbin/arp
而不是arp
,因为crontab
运行脚本/bin
默认位于 中,而 whilearp
位于 中/sbin/
。