Debian-インターネット接続が使用可能になったらすぐに起動時にスクリプトを実行する方法は?


14

Debian 7 Wheezyを実行しています。完全に機能するインターネット接続ができたらすぐに、起動時にいくつかの画面を起動する必要があります。ただし、インターネット接続が切断され、再び接続された場合はそうではありません。したがって、起動後の最初の機能的なインターネット接続でのみ。

このためのダミースクリプトを投稿して、それをどこに置き、与えられた条件下で実行させるか教えてください。

スクリプトは画面を開始して終了するだけでよく、画面は続行する必要があります。


編集 すでに/etc/network/if-up.d/フォルダについて聞いたことがあります。しかし、インターネット接続が失われて再確立された場合に、スクリプトが再度実行されないようにするにはどうすればよいですか?


@セラダ編集をご覧ください
MinecraftShamrock 14年

回答:


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
はい。Debianでは/var/run揮発性ファイルシステムであるため(a tmpfs)。そのため、新しいブートのたびに空になることが保証されています。
セラダ14年

1
良いキャッチ。あなたは本当に不運にならなければならないと思いますが、ホットプラグされたインターフェースが同時に起動される可能性があるため、そうだと思います。したがって、テストしてから作成するのではなく、これを原子的に行うことができると思いますが、それは安全になりますが、私が思いついたのはきれいではありません!python -c 'import os; os.open("/var/run/work-was-already-done", os.O_EXCL|os.O_CREAT, 0)' 2>/dev/null || exit 0
セラダ14年

3
@MinecraftShamrock Celadaのスクリプトをそのまま使用すると、ループバックインターフェイスが起動するとすぐにコードが実行されます。インターネット接続を待ちたい場合は、少なくともIFACEそうでないこと、loまたは何らかの仮想インターフェースを確認するか、またはpingでインターネット接続をテストしてください。
ジル「SO-悪であるのをやめる」14年

1
@MinecraftShamrock $IFACEは、表示されるインターフェースを値として持つことができます。あなたが存在するインターフェイスをすべて一覧表示することができますip linkスキャンしてものを育てされるように構成されているのかを見て/etc/network/interfaces
Celada

9

これは非常に適した仕事ですsystemd

systemdサービスとしてスクリプトを実行する

システムが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のDebian wheezyについては、/etc/rcS.d/S12networkingです。もちろん、すべて同じファイルへのシンボリックリンクです。また、私の答えを修正してくれてありがとう@Anthon:「Put」ではなく「Please」?なんて奇妙なタイプミス!
セラダ14年

@Celadaあなたの権利は、私の(非Debianシステム)ではrc6です。あなたがそこに「置いてください」と望んだかどうかはわかりませんでしたが、「Put」はもっとカリカリに見えました。ところで私はあなたの答えを支持しました、それはif-up.d再接続でも動作する一般的なメカニズムとしてそれを持っているので、それはネットワーキングのための単なるより良いアプローチです。
アントン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.