通過 crontab 執行時,arp 不在腳本中執行
我有一個特定的腳本來獲取特定的
IP
地址MAC
。為此,它使用arp
,並且可以正常工作。當我編寫 acrontab
來執行該腳本時,問題就來了;它工作正常並且可以執行,但是它執行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
使用 STDOUT OF COMMANDS 更新 我已將 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:
PATH
與普通互動式環境相比,cron 執行腳本的環境具有不同的變數值。這意味著您的腳本不知道在哪裡
arp
可以找到命令,例如(如註釋中所述)。我建議您通過
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
.