Tại sao các lệnh post-up trong / etc / network / interface chạy nhiều lần khi khởi động?


10

Đây là nội dung của /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

sshstartlà một kịch bản có nội dung sau:

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

Khi máy khởi động lại, curllệnh được thực thi nhiều lần, tệp kết thúc 2 hoặc 3 lần trên máy chủ ftp và khi tôi nhìn vào các quy trình, có vẻ như có nhiều phiên bản tự động chạy ... Không chắc đây là cách autossh có làm gì hay không, nhưng chắc chắn curl không nên tải tệp lên nhiều lần.

Linh cảm của tôi là toàn bộ sshstartkịch bản được chạy nhiều lần nhưng tôi không hiểu tại sao.

Tôi đã thử tìm kiếm chi tiết về quy trình thiết lập mạng khi khởi động nhưng tất cả những gì tôi có thể tìm thấy là thông tin cú pháp cho tệp giao diện.

Ai đó có thể giúp tôi không?

Cảm ơn bạn.

--- Chỉnh sửa ---

Như được đề xuất dưới đây, tôi đã sửa đổi tệp giao diện của mình như sau (đã xóa các dòng trống phía trên sau khi đăng ký):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

Và thêm dòng sau vào sshstart:

echo $(date)>>/run/shm/sshstart.log

Đây là nội dung /run/shm/sshstart.logsau khi khởi động lại:

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

Vì vậy, nó đã được chạy 4 lần :( chuyện gì đang xảy ra?


1
Gợi ý: lo đặt if-up.d thành true và eth0 cũng đặt nó thành true. Việc đăng bài chạy sau mỗi lần được đặt. Kịch bản của bạn cần phụ thuộc vào chỉ 1 giao diện được bật lên, không phải cả hai.
Eyoung100

Tôi nghĩ rằng nó có thể là một cái gì đó như thế, đoán thời gian của mình để RTFM thêm một số.
TCZ8

Tôi đã kiểm tra xung quanh và tôi không thể tìm thấy cách chỉ định bộ điều hợp nào cho lệnh đăng lên, dường như có liên quan đến "khổ thơ" nhưng tôi không hiểu chính xác. trang giao diện Debian và Ubuntu có khá nhiều thông tin nhưng họ đã bỏ qua phần đó.
TCZ8

1
Không liên quan đến câu hỏi, nhưng BTW echo $(date)hơi khó xử và gián tiếp. Cũng có thể chỉ đánh vần là như date. Tương tự như Giải vô dụng sử dụng mèo .
Celada

hahaha bạn hoàn toàn đúng! Tôi không biết tại sao tôi lại làm vậy: P
TCZ8

Câu trả lời:


13

Các tập tin /etc/network/if-up.d đã tự động chạy bất cứ khi nào một giao diện (bất kỳ giao diện nào) xuất hiện. Khi bạn chỉ định cùng một tập lệnh để chạy lại trong một post-uplệnh rõ ràng , bạn chỉ khiến tập lệnh chạy lại. Vì vậy, dự đoán của tôi là đây là những gì nên xảy ra:

  • Nó chạy một lần khi loxuất hiện (với biến môi trường IFACE=lo) do được đặt trong /etc/network/if-up.d.
  • Nó chạy một lần khi eth0xuất hiện (với biến môi trường IFACE=eth0) vì lý do tương tự.
  • Nó chạy lại khi eth0xuất hiện (với biến môi trường IFACEkhông được đặt) vì bạn đã yêu cầu điều này trong một lệnh post-up.

Tôi không chắc lần thứ tư đến từ đâu, nhưng dù sao thì đó cũng là ba.

Bạn cần xác định vị trí tập lệnh ở một nơi khác và chạy nó một lần bằng cách sử dụng lệnh post-uphoặc để nó ở vị trí của nó nhưng không đề cập đến nó trong lệnh post-upvà kiểm tra giá trị của $IFACEnó để không làm gì trừ khi giao diện mong muốn ( eth0) đã đến lên.


OHH MAN! Cuối cùng! bạn hoàn toàn đúng, tôi vừa thêm một dòng vào sshstart để lặp lại $ IFACE trong tệp nhật ký của mình và chính xác như bạn đã mô tả! Lần thứ nhất là lo, lần thứ hai là eth0, lần thứ ba là eth0 lần nữa (hình thức đăng bài) và lần thứ 4 không rõ ràng lắm .. Giá trị của $ IFACE vào lần thứ 4 là: --all Bạn sẽ không biết điều đó là gì có nghĩa? Chỉ vì tò mò :)
TCZ8

1
Tôi không biết về --all. Có vẻ như có một tính năng để chạy các if-up.dtập lệnh lần cuối với đối số này để báo hiệu rằng tất cả các giao diện đã hoạt động, trong trường hợp một số tập lệnh muốn thực hiện một hành động khi biết rằng không có giao diện nào đang chờ xử lý. Điều đó giải thích lần thứ tư.
Celada

Điều đó có ý nghĩa, cảm ơn tất cả sự giúp đỡ của bạn!
TCZ8

3

Như Celada đã nêu, /etc/network/if-up.dcác kịch bản được chạy cho từng giao diện. Để tránh trùng lặp quy tắc, chỉ cần thêm:

[ "$IFACE" = "eth0" ] || exit 0

ở đầu tập lệnh của bạn. Điều này sẽ khiến tập lệnh thoát ngay lập tức nếu giao diện không như mong muốn.


1

Xóa dòng trống trước post-up-command. Điều này sẽ liên quan đến post-uplệnh eth0chỉ. Ngoài ra di chuyển tập lệnh của bạn ra khỏi if-up.dthư mục. Các tập lệnh trong thư mục đó được thực thi tự động, bất kể được định nghĩa là post-up. Trong trường hợp của bạn, nó sẽ chạy bổ sung cho post-up-command của bạn .


Không làm việc, xem chỉnh sửa trong câu hỏi của tôi.
TCZ8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.