Debian - kullanıma hazır bir internet bağlantısı olduğu anda başlangıçta bir komut dosyası nasıl çalıştırılır?


14

Debian 7 Wheezy kullanıyorum ve tamamen işlevsel bir internet bağlantısı olduğu anda başlangıçta bazı ekranları başlatmam gerekiyor. Ancak, değil, eğer internet bağlantısı koptu ve tekrar bağlandı. Yani sadece önyüklemeden sonra ilk işlevsel internet bağlantısında.

Bunun için kukla bir senaryo yayınlayıp bana nereye koyacağımı ve verilen koşullar altında yürütülmesini söyleyebilir misiniz?

Komut dosyasının yalnızca ekranı başlatması ve sonlandırması gerekir, ancak ekran devam etmelidir.


EDIT/etc/network/if-up.d/ Klasörü daha önce duymuştum . Ancak internet bağlantısı kesilir ve yeniden kurulursa betiğin tekrar yürütülmediğinden nasıl emin olabilirim?


@Celada lütfen düzenlemeye bakın
MinecraftShamrock

Yanıtlar:


21

Komut dosyanızı yerleştirin /etc/network/if-up.dve çalıştırılabilir yapın. Bir ağ arayüzü her geldiğinde otomatik olarak çalışacaktır.

Her önyüklemede yalnızca ilk kez çalıştırılmasını sağlamak için, ilk kez oluşturduğunuz bir bayrak dosyasının varlığını kontrol etmesini sağlayın. Misal:

#!/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.

Sunucu kapatıldığında bayrak dosyası silinecek mi?
MinecraftShamrock

1
Evet, çünkü Debian'da /var/rungeçici bir dosya sistemi (a tmpfs) vardır. Bu nedenle, her yeni önyüklemede boş kalması garanti edilir.
Celada

1
İyi yakalama. Sanırım gerçekten şanssız olmalısın, ama sanırım evet, aynı anda ortaya çıkabilen sıcak fişli arayüzler yüzünden. Bu yüzden bunu test yap-oluştur yerine atomik olarak yapabilirsiniz, bu da onu güvenli hale getirir, ancak kafamın üstünden çıkardığım şey hoş değil! 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 Celada'nın komut dosyasını olduğu gibi kullanırsanız, geri döngü arabirimi gelir gelmez kodunuz çalışır. İnternet bağlantısını beklemek istiyorsanız, en azından bunun IFACEolmadığını kontrol edin lo- ya da sanal bir arayüz - ya da daha iyisi, ping yaparak İnternet bağlantısını test edin.
Gilles 'SO- kötü olmayı bırak'

1
@MinecraftShamrock $IFACE, gelen herhangi bir arabirimi değer olarak alabilir. Var olan tüm arabirimleri listeleyebilir ip linkveya hangilerinin tarama yoluyla /etc/network/interfaces
büyütülmek

9

Bu çok uygun bir iş systemd.

Bir betiği systemd hizmeti olarak çalıştırma

Sisteminiz systemd çalıştırıyorsa , komut dosyanızı yaşam döngüsü ve yürütme ortamı üzerinde denetim sağlayan bir sistemd hizmeti olarak ve ayrıca ağın çalışır durumda olması gibi komut dosyasının başlatılması için ön koşullar sağlayacak şekilde yapılandırabilirsiniz.

Kendi hizmetleriniz için önerilen klasör /etc/systemd/system/(başka bir seçenek /lib/systemd/systemancak normalde yalnızca OOTB hizmetleri için kullanılmalıdır).

Dosyayı şu şekilde oluşturun 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

Şimdi hizmeti test edebilirsiniz:

sudo systemctl start autossh

Hizmetin durumunu kontrol etme:

systemctl status autossh

Hizmetin durdurulması:

sudo systemctl stop autossh

Hizmetin beklendiği gibi çalıştığını doğruladıktan sonra aşağıdakileri etkinleştirin:

sudo systemctl enable autossh

NOT: Güvenlik amacıyla systemdkomut dosyası, komut crontabdosyalarının çalışma biçimine benzer şekilde kısıtlı bir ortamda çalıştırılır, bu nedenle $ PATH gibi önceden var olan sistem değişkenleri hakkında herhangi bir varsayımda bulunmayın. EnvironmentKomut dosyanızın tanımlanması için belirli değişkenlere ihtiyacı varsa tuşları kullanın . set -xBh komut dosyanızın üstüne ekleme ve ardından çalıştırma systemctl status my_service, komut dosyanızın neden başarısız olduğunu belirlemeye yardımcı olabilir. Bir yuvarlanma kuralı olarak, her şey için her zaman mutlak yollar kullanın echoveya ekleyerek $ PATH'inizi açıkça tanımlayın Environment=MYVAR=abc.


2

İnternet bağlantısı /etc/rc6.d/muhtemelen bir giriş tarafından getirilir S35networking. Bu dosyayı değiştirirseniz ve komutlarınızı sonuna eklerseniz veya a /etc/init.d/mystuffve bağlantısını daha iyi ekleyip /etc/rc0.d/S36mystuffkomutlarınızı oraya eklerseniz, ağ açılır açılmaz başlar.


Bağlantı kaybedilir ve sonra yeniden kurulursa çağrılacak mı? Çünkü aksi takdirde senaryoyu içine koyabilirim/etc/network/if-up.d
MinecraftShamrock

Hayır, bu sadece başlangıçta
Anthon

1
Bu işe yarayacaktır, ancak doğruluk /etc/rc0.diçin başlangıçta hiçbir komut dosyasının çalıştırılmayacağını, kapanışta çalıştırılacağını (çalışma seviyesi 0) işaret edeyim . Başlangıçta bu /etc/rc2.dveya benzeri bir şey olurdu . Özellikle OP Debian wheezy için, öyle /etc/rcS.d/S12networking. Tabii ki hepsi aynı dosyaya bağlanıyor. Ayrıca BTW @Anthon Cevabımı düzelttiğiniz için teşekkürler: "Put" yerine "Please" mu? Ne tuhaf bir yazım hatası!
Celada

@Celada Hakkınız RC6 (Debian olmayan sistemimde). Orada 'Lütfen koy' istediğinizi bilmiyordum, ama sadece "Put" daha gevrek görünüyordu. BTW Cevabınızı onayladım, ağ için daha iyi bir yaklaşım çünkü if-up.dyeniden bağlantıda da çalışan genel bir mekanizma.
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.