/ 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に設定します。ポストアップは、それぞれが設定された後に実行されます。スクリプトは、両方ではなく、1つだけのインターフェイスが起動していることに依存する必要があります。
eyoung100 2014年

それはそのようなものかもしれないと思った、RTFMにもう少し時間がかかると思います。
TCZ8 2014年

私は周りを調べましたが、後処理コマンド用のアダプターを指定する方法を見つけることができません。「スタンザ」と関係があるようですが、正確にはわかりません。DebianとUbuntuのインターフェースページにはかなり多くの情報がありますが、その部分はスキップされました。
TCZ8 2014年

1
質問とは関係ありませんが、BTW echo $(date)は少し厄介で間接的です。それをと綴るだけでもよいでしょうdate猫賞の無用な使用に似ています。
Celada、2014年

ははは!あなたは、絶対に正しい!なぜ私がそれをしたのか私には手がかりがありません:P
TCZ8 2014年

回答:


13

内のファイルは/etc/network/if-up.d すでにインタフェース(任意のインタフェース)が立ち上がるたびに自動的に実行します。明示的なpost-upコマンドで同じスクリプトを再度実行するように指定すると、スクリプトのみが再度実行されます。だから私の推測はこれが起こるべきことです:

  • に配置されているため、lo(環境変数を使用してIFACE=lo)起動時に1回実行され/etc/network/if-up.dます。
  • 同じ理由で、eth0(環境変数を使用してIFACE=eth0)起動時に1回実行されます。
  • ディレクティブでこれを要求したため、eth0(環境変数がIFACE設定されていない)起動時に再び実行されますpost-up

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

スクリプトを別の場所に配置して、post-upディレクティブを使用して一度実行するか、そのままにして、post-upディレクティブに記述せずに値を確認して$IFACE、目的のインターフェイス(eth0)がない限り何もしないようにする必要があります。アップ。


OHH MAN!最後に!間違いなく、sshstartに行を追加して$ IFACEをログファイルにエコーし、そのとおりに記述しました。1回目はlo、2回目はeth0、3回目は再びeth0(ポストアップを形成)、4回目はそれほど明確ではありません。4回目の$ IFACEの値は次のとおりです。--all手段?好奇心だけで:)
TCZ8 2014年

1
知りませんでした--allif-up.d保留中のインターフェースがなくなったことが判明した場合にスクリプトがアクションを実行したい場合に備えて、この引数を使用してスクリプトを最後にもう一度実行してすべてのインターフェースが稼働していることを通知する機能があるようです。それは4回目を説明しています。
Celada、2014年

それは理にかなっています、あなたのすべての助けに感謝します!
TCZ8 2014年

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-コマンドに加えて実行されます。


動作しません。私の質問の編集を参照してください。
TCZ8 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.