crontab을 통해 실행할 때 arp가 스크립트에서 실행되지 않습니다.

crontab을 통해 실행할 때 arp가 스크립트에서 실행되지 않습니다.

IP특정 주소를 얻기 위한 특정 스크립트가 있습니다 MAC. 이를 위해 사용되며 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 데몬 로그 업데이트 사용

● 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 명령을 사용하여 업데이트 crontab 명령에 XXXX 리디렉션을 추가했습니다 >/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

PATHcron이 스크립트를 실행하는 환경은 일반적인 대화형 환경과 비교하여 변수 값이 다릅니다.

이는 스크립트가 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.

답변2

arp에서 스크립트를 실행 하려면 대신 as 경로를 crontab사용해야 합니다 . 왜냐하면 스크립트 실행은 기본적으로 while 에 있기 때문입니다 .arp/sbin/arparpcrontab/binarp/sbin/

관련 정보