/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の処理方法かどうかはわかりませんが、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回実行されました:(どうなっているのですか?
/etc/network/if-up.d
内のファイルalreadyインターフェイス(任意のインターフェイス)が起動するたびに自動的に実行されます。明示的なpost-up
コマンドで同じスクリプトを再度実行するように指定すると、スクリプトのみが再度実行されます。だから私の推測はこれが起こるべきことです:
IFACE=lo
にあるため、lo
が(環境変数/etc/network/if-up.d
を使用して)起動すると1回実行されます。eth0
が(環境変数IFACE=eth0
を使用して)起動すると、1回実行されます。eth0
ディレクティブでこれを要求したため、post-up
が(環境変数IFACE
unsetで)表示されたときに再び実行されます。4回目はどこから来たのかわかりませんが、とにかく3回目です。
スクリプトを別の場所に配置し、post-up
ディレクティブを使用して一度実行するか、post-up
ディレクティブでスクリプトを記述せずに$IFACE
の値を確認して、目的のインターフェイスでない限り何もしないようにする必要があります( eth0
)が登場しました。
Celadaによると、/etc/network/if-up.d
スクリプトは、インターフェイスごとに実行されます。ルールの重複を回避するには、次を追加します。
[ "$IFACE" = "eth0" ] || exit 0
スクリプトの上部。これにより、インターフェースが必要なものでない場合、スクリプトはすぐに終了します。
post-up
-コマンドの前の空行を削除します。これは、post-up
コマンドをeth0
のみに関連付ける必要があります。さらに、if-up.d
フォルダーからスクリプトを移動します。そのフォルダー内のスクリプトは、post-up
として定義されているかどうかに関係なく、自動的に実行されます。あなたの場合、それはあなたのpost-up
コマンドに追加で実行されます。