首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当通过crontab运行时,arp不会在脚本中运行

当通过crontab运行时,arp不会在脚本中运行
EN

Unix & Linux用户
提问于 2020-04-30 09:56:33
回答 2查看 726关注 0票数 0

我有一个特定的脚本,它获取特定MACD1地址。为此,它使用了arp,并且工作正常。当我编写一个crontab来运行该脚本时,问题就出现了;它运行良好并运行,但是它运行arp命令的行不起作用,因此,只有在从crontab运行时,脚本才能正确完成。

剧本是:

代码语言:javascript
复制
#!/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中的时间调度工作做得很好,脚本运行也很顺利,排除了权限或脚本问题。它们的证据是它生成的日志文件:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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

代码语言:javascript
复制
● 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

UPDATE使用命令的STDOUT添加了XXXX重定向到crontab命令>/tmp/logfile 2>&1,滞后:

代码语言:javascript
复制
* * * * * /root/machaunter.sh >/tmp/logfile 2>&1

/tmp/logfile中我得到:

代码语言:javascript
复制
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:
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-04-30 14:00:30

与普通的交互环境相比,cron运行脚本的环境对于PATH变量具有不同的值。

这意味着您的脚本不知道在哪里可以找到arp命令,例如(如评论中所述)。

我建议您通过在交互式shell中为每个目录运行command -v,在脚本中使用的工具是哪些目录。

代码语言:javascript
复制
command -v nmap
command -v arp

等。

这将给出这些命令的路径名列表。获取这些目录名,并将它们添加到脚本本身中的PATH中(在脚本开头的某个地方):

代码语言:javascript
复制
PATH=$PATH:/some/directory/path:/another/directory/path

在脚本中这样做可以保证脚本将找到该工具。

最后,您可能只需要添加/usr/sbin

代码语言:javascript
复制
PATH=$PATH:/usr/sbin

另一种选择是使用这些工具的绝对路径,比如使用/usr/sbin/arp而不仅仅是arp

票数 3
EN

Unix & Linux用户

发布于 2021-10-22 00:41:53

要在crontab中运行D1脚本,必须使用arp路径而不是arp,因为默认情况下,crontab运行位于/bin中的脚本,而arp位于/sbin/中。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/583516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档