web-dev-qa-db-ja.com

Debian-インターネット接続の準備ができたらすぐに起動時にスクリプトを実行する方法?

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

このためのダミースクリプトを投稿して、それをどこに配置し、指定された条件下で実行できるようにしてください。

スクリプトは、画面を起動して終了するだけで済みますが、画面は続行する必要があります。


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

15

スクリプトを/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.
21
Celada

これは 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などの既存のシステム変数については想定しないでください。または、/.bashrc~/.zshrcなどにあるもの。スクリプトで特定の変数を定義する必要がある場合は、Environmentキーを使用します。 bashスクリプトの先頭にset -xを追加してからsystemctl status my_serviceを実行すると、スクリプトが失敗した理由を特定するのに役立つ場合があります。原則として、echoを含むすべてに対して常に 絶対パス を使用するか、Environment=MYVAR=abcを追加して$ PATHを明示的に定義します。

10
ccpizza

インターネット接続は、/etc/rc6.d/のエントリによって起動されます。おそらくS35networkingです。そのファイルを変更してコマンドを最後に挿入するか、/etc/init.d/mystuffを追加して/etc/rc0.d/S36mystuffをリンクし、そこにコマンドを挿入すると、ネットワークが起動するとすぐに開始されます。

2
Anthon