Debian - làm thế nào để chạy tập lệnh khi khởi động ngay khi có kết nối internet sẵn sàng để sử dụng?


14

Tôi đang chạy Debian 7 Wheezy và tôi cần khởi động một số màn hình khi khởi động ngay khi có kết nối internet đầy đủ chức năng. Tuy nhiên, không, nếu kết nối internet bị hỏng và được kết nối lại. Vì vậy, chỉ trên kết nối internet chức năng đầu tiên sau khi khởi động.

Bạn có thể vui lòng gửi một kịch bản giả cho điều này và cho tôi biết nơi để đặt nó và làm cho nó được thực hiện trong các điều kiện nhất định?

Kịch bản chỉ cần khởi động màn hình và sau đó chấm dứt nhưng màn hình vẫn tiếp tục.


EDIT Tôi đã nghe nói về /etc/network/if-up.d/thư mục. Nhưng làm thế nào tôi có thể chắc chắn rằng tập lệnh không được thực thi lại nếu kết nối internet bị mất và sau đó được thiết lập lại?


@Celada vui lòng xem bản chỉnh sửa
MinecraftShamrock

Câu trả lời:


21

Đặt tập lệnh của bạn vào /etc/network/if-up.dvà làm cho nó thực thi được. Nó sẽ được tự động chạy mỗi khi giao diện mạng xuất hiện.

Để làm cho nó hoạt động chỉ lần đầu tiên được chạy trên mỗi lần khởi động, hãy kiểm tra sự tồn tại của tệp cờ mà bạn tạo sau lần đầu tiên. Thí 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.

Flagfile sẽ bị xóa khi máy chủ tắt?
MinecraftShamrock

1
Có, bởi vì trên Debian /var/runlà một hệ thống tệp dễ bay hơi (a tmpfs). Vì vậy, nó được đảm bảo để trống rỗng ở mỗi lần khởi động mới.
Celada

1
Nắm bắt tốt. Tôi nghĩ rằng bạn phải thực sự không may mắn, nhưng tôi nghĩ là có, bởi vì các giao diện được cắm nóng có thể được đưa lên cùng một lúc. Vì vậy, tôi đoán bạn có thể thực hiện việc này một cách nguyên tử thay vì thử nghiệm sau đó tạo, điều này sẽ làm cho nó an toàn, nhưng những gì tôi nghĩ ra khỏi đỉnh đầu của tôi không đẹp! python -c 'import os; os.open("/var/run/work-was-already-done", os.O_EXCL|os.O_CREAT, 0)' 2>/dev/null || exit 0
Celada

3
@MinecraftShamrock Nếu bạn sử dụng tập lệnh của Celada, mã của bạn sẽ chạy ngay khi giao diện loopback xuất hiện. Nếu bạn muốn chờ kết nối internet, ít nhất hãy kiểm tra xem IFACEkhông phải lo- hoặc một số giao diện ảo - hoặc tốt hơn, hãy kiểm tra kết nối Internet bằng cách ping.
Gilles 'SO- ngừng trở nên xấu xa'

1
@MinecraftShamrock $IFACEcó thể có giá trị như bất kỳ giao diện nào xuất hiện. Bạn có thể liệt kê tất cả các giao diện tồn tại cùng ip linkhoặc xem giao diện nào được cấu hình để đưa lên bằng cách quét/etc/network/interfaces
Celada

9

Đây là một công việc rất phù hợp cho systemd.

Chạy một kịch bản như một dịch vụ systemd

Nếu hệ thống của bạn đang chạy systemd , thì bạn có thể định cấu hình tập lệnh của mình để chạy như một dịch vụ systemd cung cấp quyền kiểm soát vòng đời và môi trường thực thi, cũng như các điều kiện tiên quyết để bắt đầu tập lệnh, như mạng đang hoạt động.

Thư mục được đề xuất cho các dịch vụ của riêng bạn là /etc/systemd/system/(tùy chọn khác là /lib/systemd/systemnhưng thông thường chỉ được sử dụng cho các dịch vụ OOTB).

Tạo tệp, ví dụ 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

Bây giờ bạn có thể kiểm tra dịch vụ:

sudo systemctl start autossh

Kiểm tra trạng thái của dịch vụ:

systemctl status autossh

Dừng dịch vụ:

sudo systemctl stop autossh

Khi bạn xác minh rằng dịch vụ hoạt động như mong đợi, hãy kích hoạt nó với:

sudo systemctl enable autossh

LƯU Ý: Vì mục đích bảo mật systemdsẽ chạy tập lệnh trong môi trường bị hạn chế, tương tự như cách crontabtập lệnh được chạy, do đó, không đưa ra bất kỳ giả định nào về các biến hệ thống có sẵn như $ PATH. Sử dụng các Environmentkhóa nếu tập lệnh của bạn cần các biến cụ thể được xác định. Thêm set -xvào đầu tập lệnh bash của bạn và sau đó chạy systemctl status my_servicecó thể giúp xác định lý do tại sao tập lệnh của bạn bị lỗi. Theo quy tắc, luôn luôn sử dụng các đường dẫn tuyệt đối cho tất cả mọi thứ bao gồm echohoặc xác định rõ ràng $ PATH của bạn bằng cách thêm Environment=MYVAR=abc.


2

Kết nối internet được đưa lên bởi một mục trong /etc/rc6.d/có lẽ S35networking. Nếu bạn thay đổi tệp đó và chèn các lệnh của bạn ở cuối, hoặc tốt hơn là thêm một /etc/init.d/mystuffvà liên kết /etc/rc0.d/S36mystuffvới nó và chèn các lệnh của bạn ở đó, thì điều đó sẽ bắt đầu ngay khi mạng kết thúc.


Nó sẽ được gọi nếu kết nối bị mất và sau đó được thiết lập lại? Bởi vì nếu không tôi chỉ có thể đặt tập lệnh vào/etc/network/if-up.d
MinecraftShamrock

Không, đây chỉ là lúc khởi động
Anthon

1
Điều đó sẽ hoạt động, nhưng chỉ cho chính xác, hãy để tôi chỉ ra rằng không có đoạn script nào /etc/rc0.dđược chạy khi khởi động, những đoạn này sẽ chạy khi tắt máy (chạy mức 0). Khi khởi động nó sẽ là một cái gì đó trong /etc/rc2.dhoặc tương tự. Cụ thể đối với Debian khò khè, đó là /etc/rcS.d/S12networking. Tất cả các liên kết đến cùng một tập tin, tất nhiên. Ngoài ra BTW @Anthon cảm ơn vì đã sửa câu trả lời của tôi: "Xin vui lòng" thay vì "Đặt"? Thật là một lỗi đánh máy kỳ lạ!
Celada

@Celada Quyền của bạn là RC6 trên (hệ thống không phải Debian) của tôi. Tôi không chắc bạn có muốn 'Vui lòng đặt' ở đó không, nhưng chỉ "Đặt" có vẻ giòn hơn. BTW Tôi nêu lên câu trả lời của bạn, nó chỉ là một cách tiếp cận tốt hơn cho mạng vì nó có if-up.dcơ chế chung chung cũng hoạt động trên một kết nối lại.
Anthon
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.