/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

4番目はどこから来たのかわかりませんが、とにかく3番目でした。

スクリプトを別の場所に置き、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- コマンドはさらに実行されます。

関連情報