Debian - bagaimana menjalankan skrip pada startup segera setelah ada koneksi internet yang siap digunakan?

14

Saya menjalankan Debian 7 Wheezy dan saya harus memulai beberapa layar saat startup segera setelah ada koneksi internet yang berfungsi penuh. Namun, tidak, jika koneksi internet terputus dan terkoneksi lagi. Jadi hanya pada koneksi internet fungsional pertama setelah boot.

Bisakah Anda memposting naskah boneka untuk ini dan memberi tahu saya di mana harus meletakkannya dan membuatnya dieksekusi di bawah kondisi yang diberikan?

Script hanya perlu memulai layar dan kemudian berhenti tetapi layar harus dilanjutkan.


EDIT Saya sudah pernah mendengar /etc/network/if-up.d/folder. Tetapi bagaimana saya bisa memastikan bahwa skrip tidak dieksekusi lagi jika koneksi internet terputus dan kemudian dibangun kembali?

MinecraftShamrock
sumber
@Celada silakan lihat hasil edit
MinecraftShamrock

Jawaban:

21

Masukkan skrip Anda /etc/network/if-up.ddan buat itu bisa dieksekusi. Ini akan dijalankan secara otomatis setiap kali antarmuka jaringan muncul.

Untuk membuatnya berfungsi hanya saat pertama kali dijalankan pada setiap boot, periksalah apakah ada file flag yang Anda buat setelah pertama kali. Contoh:

#!/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.
Celada
sumber
Apakah flagfile akan dihapus ketika server dimatikan?
MinecraftShamrock
1
Ya, karena pada Debian /var/runadalah sistem file yang mudah menguap (a tmpfs). Jadi dijamin akan muncul kosong di setiap boot baru.
Celada
1
Tangkapan yang bagus. Saya pikir Anda harus benar-benar sial, tapi saya pikir ya, karena antarmuka yang terhubung ke panas yang dapat dibesarkan secara bersamaan. Jadi saya kira Anda bisa melakukan ini secara atom daripada uji-lalu-buat, yang akan membuatnya aman, tapi apa yang saya dapatkan dari atas kepala saya tidak cantik! 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 Jika Anda menggunakan skrip Celada apa adanya, kode Anda akan berjalan segera setelah antarmuka loopback muncul. Jika Anda ingin menunggu konektivitas internet, setidaknya periksa IFACEapakah tidak lo- atau antarmuka virtual - atau lebih baik, uji konektivitas internet dengan melakukan ping.
Gilles 'SO- stop being evil'
1
@MinecraftShamrock $IFACEdapat memiliki nilai antarmuka apa pun yang muncul. Anda dapat membuat daftar semua antarmuka yang ada dengan ip linkatau melihat yang dikonfigurasi untuk dibawa oleh pemindaian/etc/network/interfaces
Celada
9

Ini adalah pekerjaan yang sangat cocok untuk Anda systemd.

Menjalankan skrip sebagai layanan systemd

Jika sistem Anda menjalankan systemd , maka Anda dapat mengonfigurasi skrip Anda untuk dijalankan sebagai layanan systemd yang menyediakan kontrol atas siklus hidup dan lingkungan eksekusi, serta prasyarat untuk memulai skrip, seperti jaringan yang sedang berjalan dan berjalan.

Folder yang disarankan untuk layanan Anda sendiri adalah /etc/systemd/system/(opsi lain adalah /lib/systemd/systemtetapi yang biasanya hanya digunakan untuk layanan OOTB).

Buat file misalnya dengan 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

Sekarang Anda dapat menguji layanan:

sudo systemctl start autossh

Memeriksa status layanan:

systemctl status autossh

Menghentikan layanan:

sudo systemctl stop autossh

Setelah Anda memverifikasi bahwa layanan berfungsi seperti yang diharapkan, aktifkan dengan:

sudo systemctl enable autossh

CATATAN: Untuk tujuan keamanan systemdakan menjalankan skrip dalam lingkungan terbatas, mirip dengan bagaimana crontabskrip dijalankan, oleh karena itu jangan membuat asumsi tentang variabel sistem yang sudah ada sebelumnya seperti $ PATH. Gunakan Environmentkunci jika skrip Anda membutuhkan variabel tertentu untuk didefinisikan. Menambahkan set -xdi bagian atas skrip bash Anda dan kemudian menjalankannya systemctl status my_servicedapat membantu mengidentifikasi mengapa skrip Anda gagal. Sebagai patokan, selalu gunakan jalur absolut untuk semuanya termasuk echo, atau secara eksplisit mendefinisikan $ PATH Anda dengan menambahkan Environment=MYVAR=abc.

ccpizza
sumber
2

Koneksi internet yang dibesarkan oleh sebuah entri di /etc/rc6.d/mungkin S35networking. Jika Anda mengubah file itu dan menyisipkan perintah Anda di akhir, atau lebih baik menambahkan /etc/init.d/mystufftautan /etc/rc0.d/S36mystuffke sana dan menyisipkan perintah Anda di sana, maka itu akan dimulai segera setelah jaringan menyala.

Anthon
sumber
Apakah akan dipanggil jika koneksi terputus dan kemudian dibangun kembali? Karena kalau tidak, saya bisa memasukkan script ke/etc/network/if-up.d
MinecraftShamrock
Tidak, ini baru saat startup
Anthon
1
Itu akan berhasil, tetapi hanya untuk kebenaran, izinkan saya menunjukkan bahwa tidak ada skrip di /etc/rc0.dakan dijalankan pada saat startup, mereka akan berjalan pada saat shutdown (run level 0). Pada saat startup itu akan menjadi sesuatu yang /etc/rc2.dmirip atau mirip. Khusus untuk mengi Debian OP, itu /etc/rcS.d/S12networking. Itu semua symlink ke file yang sama, tentu saja. BTW @Anthon terima kasih telah memperbaiki jawaban saya: "Tolong" bukannya "Put"? Benar-benar kesalahan ketik yang aneh!
Celada
@Celada Hak Anda adalah rc6 di (sistem non-Debian) saya. Saya tidak yakin apakah Anda ingin 'Tolong taruh' di sana, tapi "Taruh" sepertinya lebih renyah. BTW Saya memutakhirkan jawaban Anda, itu hanya pendekatan yang lebih baik untuk jaringan karena memiliki if-up.dmekanisme umum yang juga berfungsi pada koneksi kembali.
Anthon