/etc/network/interfaces의 post-up 명령이 시작 시 여러 번 실행되는 이유는 무엇입니까?

/etc/network/interfaces의 post-up 명령이 시작 시 여러 번 실행되는 이유는 무엇입니까?

내용은 다음과 같습니다 /etc/network/interfaces.

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

sshstart다음을 포함하는 스크립트 입니다 .

curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 [email protected] -p 8080

머신이 재부팅되면 curl명령이 여러 번 실행되고 파일이 ftp 서버에 2~3번 저장되고 프로세스를 보면 autossh 인스턴스가 여러 개 실행 중인 것 같습니다. 이것이 맞는지 확실하지 않습니다. autossh는 그렇지 않지만 확실히 컬은 파일을 여러 번 업로드해서는 안됩니다.

내 직감은 전체 sshstart스크립트가 여러 번 실행되지만 이유를 이해할 수 없다는 것입니다.

시작 시 네트워크 설정 프로세스에 대한 세부 정보를 검색해 보았지만 찾을 수 있는 것은 인터페이스 파일의 구문 정보뿐이었습니다.

누구든지 도와줄 수 있나요?

감사해요.

- -편집하다- -

아래와 같이 인터페이스 파일을 다음과 같이 수정했습니다(게시물 위의 빈 줄 제거).

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

sshstart에 다음 줄을 추가합니다.

echo $(date)>>/run/shm/sshstart.log

/run/shm/sshstart.log다시 시작한 후의 모습은 다음과 같습니다.

Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014

그래서 4번 실행되었습니다. :( 무슨 일이 일어났나요?

답변1

파일은 다음 위치에 있습니다./etc/network/if-up.d 이미인터페이스(모든 인터페이스)가 나타날 때마다 자동으로 실행됩니다. 동일한 스크립트를 다시 실행하려는 명시적 명령을 지정하면 post-up단순히 스크립트가 다시 실행됩니다. 그래서 내 추측은 다음과 같습니다.

  • lo에 위치해 IFACE=lo있기 때문입니다 ./etc/network/if-up.d
  • 같은 이유로 eth0발생 시 한 번만 실행됩니다(환경 변수 사용).IFACE=eth0
  • eth0IFACE지시어에서 요청했기 때문에 존재하는 경우(환경 변수가 설정되지 않은 경우) 다시 실행됩니다 post-up.

네 번째는 어디서 왔는지는 모르겠지만 어쨌든 세 번째였다.

스크립트를 다른 곳에 위치시키고 post-up지시어와 함께 한 번 실행하거나, 지시어에 언급하지 않고 제자리에 두고 post-up값을 확인하여 $IFACE필요한 인터페이스가 존재하지 않는 한 eth0아무것도 하지 않도록 해야 합니다 . .

답변2

Celada가 말했듯 /etc/network/if-up.d이 스크립트는 각 인터페이스에 대해 실행됩니다. 규칙의 중복을 피하려면 다음을 추가하세요.

[ "$IFACE" = "eth0" ] || exit 0

스크립트 상단에 있습니다. 인터페이스가 원하는 인터페이스가 아닌 경우 스크립트가 즉시 종료됩니다.

답변3

의 스크립트는 /etc/network/if-*.d각 인터페이스에 대해 실행되지만모든 주소군에도 적용됩니다.(IPv4 및 IPv6).

$ADDRFAMIPv4 및 IPv6 제품군 모두에 대해 스크립트를 실행하는 것을 원하지 않거나 필요하지 않은 경우 이 변수를 확인할 수 있습니다.

예를 들어 특정 인터페이스와 해당 IPv4 주소에 대해서만 스크립트를 실행해야 하는 경우 다음으로 시작할 수 있습니다.

[ "$IFACE"   = "eth0" ] || exit 0  # we only want interface "eth0"
[ "$ADDRFAM" = "inet" ] || exit 0  # we only want IPv4 (not "inet6" for IPv6)

답변4

- 명령 앞의 빈 줄을 제거하십시오 post-up. 이 post-up명령은 다음과 만 eth0연결 되어야 합니다 . 또한 스크립트를 if-up.d폴더 밖으로 이동하십시오 . 해당 폴더의 스크립트는 으로 정의되었는지 여부에 관계없이 자동으로 실행됩니다 post-up. 귀하의 경우 post-up- 명령이 추가로 실행됩니다.

관련 정보