부팅시 / etc / network / interfaces의 게시 명령이 여러 번 실행되는 이유는 무엇입니까?


10

내용은 다음과 같습니다 /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 username@17.16.15.2 -p 8080

컴퓨터가 재부팅되면 curl명령이 여러 번 실행되고 파일이 ftp 서버에서 2 ~ 3 번 끝나고 프로세스를 볼 때 autossh 인스턴스가 여러 개있는 것처럼 보입니다 ...이 방법인지 확실하지 않습니다 autossh는 작업을 수행하거나 수행하지 않지만 curl은 파일을 여러 번 업로드해서는 안됩니다.

내 직감은 전체 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
힌트 : lo는 if-up.d를 true로 설정하고 eth0도이를 true로 설정합니다. 포스트 업은 각각 설정 한 후에 실행됩니다. 스크립트는 둘 중 하나가 아닌 하나의 인터페이스에만 의존해야합니다.
eyoung100

나는 그것이 그렇게 될 수 있다고 생각했습니다. RTFM에 대한 시간을 더 추측하십시오.
TCZ8

나는 주변을 둘러 보았고 post-up 명령에 어떤 어댑터를 지정하는 방법을 찾을 수 없지만 "stanza"와 관련이있는 것 같지만 정확하게 얻지는 못합니다. 데비안과 우분투 인터페이스 페이지에는 많은 정보가 있지만 그 부분을 건너 뛰었습니다.
TCZ8

1
질문과 관련이 없지만 BTW echo $(date)는 다소 어색하고 간접적입니다. 뿐만 아니라 철자를 수도 있습니다 date. 쓸데없는 고양이 상 사용과 유사합니다 .
Celada

하하하! 당신은 절대적으로 옳다! 나는 왜 그런 짓을했는지 전혀 모른다. : P
TCZ8

답변:


13

인터페이스 (모든 인터페이스)가 나타날 때마다 파일이 /etc/network/if-up.d 이미 자동으로 실행됩니다. 명시 적 post-up명령 에서 동일한 스크립트를 다시 실행하도록 지정하면 스크립트가 다시 실행됩니다. 그래서 내 생각 엔 이것이 일어날 것입니다 :

  • 에 위치 lo하여 환경 변수와 함께 올 때 한 번 실행됩니다 .IFACE=lo/etc/network/if-up.d
  • 같은 이유로 eth0환경 변수가있는 경우 한 번 실행됩니다 IFACE=eth0.
  • 지시문 에서이를 요청했기 때문에 eth0환경 변수가 IFACE설정되지 않은 상태 에서 다시 실행됩니다 post-up.

나는 네 번째 시간이 어디에서 왔는지 확실하지 않지만 어쨌든 이미 3입니다.

스크립트를 다른 곳에서 찾아서 post-up지시문을 사용하여 한 번 실행 하거나 지시문에 그대로 두지 말고 지시문에 언급 하지 말고 원하는 인터페이스 ( )가 나오지 않으면 아무것도하지 않도록 post-up값을 확인해야합니다. 쪽으로.$IFACEeth0


오맨! 드디어! 당신은 절대적으로 맞습니다. 방금 sshstart에 줄을 추가하여 로그 파일에 $ IFACE를 에코하고 설명대로 정확하게! 첫 번째 시간은 lo, 두 번째 시간은 eth0, 세 번째는 eth0 (포스트 업 양식)이며 네 번째 시간은 명확하지 않습니다. 네 번째 시간에 $ IFACE의 가치는 다음과 같습니다. --all 방법? 그냥 호기심에 의해 :)
TCZ8

1
나는 몰랐다 --all. 이 if-up.d인터페이스를 통해 스크립트를 마지막으로 실행하는 기능 이있어 모든 인터페이스가 작동한다는 신호를 보냅니다. 일부 스크립트가 더 이상 보류중인 인터페이스가없는 것으로 알려진 경우 조치를 취하려고하는 경우에 대비합니다. 그것은 네 번째 시간을 설명합니다.
Celada

모든 도움을 주셔서 감사합니다!
TCZ8

3

Celada가 언급했듯이 /etc/network/if-up.d각 인터페이스마다 스크립트가 실행됩니다. 규칙 복제를 피하려면 다음을 추가하십시오.

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

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


1

post-up-command 전에 빈 줄을 삭제하십시오 . 이것은 post-up명령 eth0에만 관련되어야 합니다. 또한 스크립트를 if-up.d폴더 밖으로 옮기십시오 . 로 정의 된 경우에 상관없이 해당 폴더의 스크립트가 자동으로 실행됩니다 post-up. 귀하의 경우에는 post-up-command에 추가로 실행됩니다 .


작동하지 않으면 내 질문의 수정 사항을 참조하십시오.
TCZ8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.