데비안-인터넷 연결이 준비 되 자마자 시작시 스크립트를 실행하는 방법은 무엇입니까?


14

데비안 7 Wheezy를 실행 중이며 인터넷에 완전히 연결되는 즉시 시작시 일부 화면을 시작해야합니다. 그러나 인터넷 연결이 끊어지고 다시 연결된 경우에는 그렇지 않습니다. 따라서 부팅 후 첫 번째 기능성 인터넷 연결에서만.

이것에 대한 더미 스크립트를 게시하고 주어진 조건에서 스크립트를 어디에 넣고 실행할 수 있는지 알려주십시오.

스크립트는 화면을 시작한 다음 종료하면되지만 화면은 계속 진행해야합니다.


편집 이미 /etc/network/if-up.d/폴더에 대해 들었습니다 . 그러나 인터넷 연결이 끊긴 다음 다시 설정되면 스크립트가 다시 실행되지 않도록하려면 어떻게해야합니까?


@Celada 편집을 참조하십시오
MinecraftShamrock

답변:


21

스크립트를 /etc/network/if-up.d넣고 실행 가능하게 만드십시오. 네트워크 인터페이스가 나타날 때마다 자동으로 실행됩니다.

부팅 할 때마다 처음으로 실행될 때만 작동하게하려면 처음 생성 한 플래그 파일이 있는지 확인하십시오. 예:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.

서버가 종료 될 때 플래그 파일이 삭제됩니까?
MinecraftShamrock

1
예. 데비안 /var/run에서는 휘발성 파일 시스템 (a tmpfs) 이기 때문입니다 . 따라서 새로 부팅 할 때마다 비어있는 것이 보장됩니다.
Celada

1
잘 잡았습니다. 나는 당신이 정말로 운이 좋지 않을 것이라고 생각하지만, 동시에 일어날 수있는 핫 플러그 ​​된 인터페이스 때문에 그렇습니다. 그래서 나는 당신이 test-then-create 대신에 원자 적으로 이것을 할 수 있다고 생각합니다. python -c 'import os; os.open("/var/run/work-was-already-done", os.O_EXCL|os.O_CREAT, 0)' 2>/dev/null || exit 0
Celada

3
@MinecraftShamrock Celada의 스크립트를있는 그대로 사용하면 루프백 인터페이스가 작동하는 즉시 코드가 실행됩니다. 당신은 인터넷 연결을 위해 적어도 체크 기다리고 싶지 않으면 IFACE하지 lo핑으로 인터넷 연결을위한 이상, 시험 - 또는 어떤 가상 인터페이스를 -.
Gilles 'SO- 악의를 그만두십시오

1
@MinecraftShamrock $IFACE은 모든 인터페이스를 값으로 가질 수 있습니다. 존재하는 모든 인터페이스를 나열 ip link하거나 스캔을 통해 어떤 인터페이스 가 구성되어 있는지 확인할 수 있습니다./etc/network/interfaces
Celada

9

이것은 매우 적합한 직업입니다 systemd.

시스템 서비스로 스크립트 실행

시스템에서 systemd를 실행중인 경우 수명주기 및 실행 환경을 제어하고 네트워크 시작 및 실행과 같은 스크립트 시작을위한 사전 조건을 제공하는 시스템 서비스로 실행되도록 스크립트를 구성 할 수 있습니다.

자신의 서비스에 권장되는 폴더는 /etc/systemd/system/다른 옵션 /lib/systemd/system이지만 일반적으로 OOTB 서비스에만 사용되어야합니다.

예를 들어 다음과 같이 파일을 작성하십시오 sudo vim /etc/systemd/system/autossh.service.

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

이제 서비스를 테스트 할 수 있습니다 :

sudo systemctl start autossh

서비스 상태 확인 :

systemctl status autossh

서비스 중지

sudo systemctl stop autossh

서비스가 예상대로 작동하는지 확인한 후 다음을 사용하여 활성화하십시오.

sudo systemctl enable autossh

참고 : 보안을 위해 스크립트가 실행 systemd되는 방식과 유사하게 제한된 환경에서 crontab스크립트를 실행하므로 $ PATH와 같은 기존 시스템 변수에 대해 가정하지 마십시오. Environment스크립트에 특정 변수를 정의해야하는 경우 키를 사용하십시오 . set -xbash 스크립트 맨 위에 추가 한 다음 실행 systemctl status my_service하면 스크립트가 실패한 이유를 식별하는 데 도움이 될 수 있습니다. tumb의 원칙으로 항상을 포함하여 모든 것에 절대 경로 를 사용하거나을 echo추가하여 $ PATH를 명시 적으로 정의하십시오 Environment=MYVAR=abc.


2

인터넷 연결은 /etc/rc6.d/아마도 항목에 의해 발생합니다 S35networking. 해당 파일을 변경하고 끝에 명령을 삽입하거나 파일에 /etc/init.d/mystuff링크 /etc/rc0.d/S36mystuff를 추가하고 명령을 삽입하면 네트워크가 시작되는 즉시 시작됩니다.


연결이 끊어졌다가 다시 설정되면 호출됩니까? 그렇지 않으면 스크립트를 넣을 수 있기 때문에/etc/network/if-up.d
MinecraftShamrock

아니 이것은 시작에 불과하다
Anthon

1
작동하지만, 정확성을 위해 /etc/rc0.d시작시 스크립트 가 실행 되지 않으며 종료시 실행됩니다 (실행 레벨 0). 시작할 때 /etc/rc2.d또는 비슷한 것입니다. 특히 OP의 데비안 wheezy의 경우 /etc/rcS.d/S12networking입니다. 물론 모든 파일이 동일한 파일에 연결됩니다. 또한 BTW @Anthon은 답변을 수정 해 주셔서 감사합니다. "Put"대신 "Please"? 정말 이상한 오타!
Celada

@Celada 당신의 권리는 내 (데비안 시스템이 아닌)에서 rc6입니다. 나는 당신이 거기에 'Please put'을 원했는지 확신하지 못했지만 "Put"만 더 바삭 바삭했습니다. BTW 나는 당신의 대답을 찬성했습니다. 그것은 if-up.d재 연결에서 작동하는 일반적인 메커니즘으로 네트워킹에 대한 더 나은 접근 방식 일뿐 입니다.
Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.