Bir ana bilgisayarın hayatta olup olmadığını görmek için Kabuk komutu / komut dosyası?


9

Ben sadece kabuk komutları (öncelikle bash) kullanarak, verilen bir ana bilgisayar yukarı olup olmadığını görmek için daha fazla yol bulmaya çalışıyorum. İdeal olarak, hem ana makine adları hem de IP adresleri ile çalışabilir. Şu anda bildiğim tek yerel yol, belki de burada açıklandığı gibi bir senaryoya entegre edilmiş ping . Başka fikir var mı?

Yanıtlar:


7

ping olan bir konak canlı ve bağlı olup olmadığını test etmek için bir yol. (Bir ana bilgisayar canlıysa ancak bağlantısı kesilmiş veya yanıt vermesi yavaşsa, bunu ölümünden ayırt edemezsiniz.)

pingKomut tarafından desteklenen seçenekler sistemden sisteme değişir. Sonsuza kadar dönmediğinden emin olun, ancak bir yanıt almadıysa birkaç saniye sonra geri döner.

FreeBSD ve Linux iputils ile ping -c 1 -W 1 >/dev/nulltek bir ping gönderir ve 1 saniye bekler. Çıktıyı ayrıştırmanıza gerek yoktur: aksi takdirde geri ping ve sıfır olmayan bir komut alırsa komut 0 değerini döndürür (bilinmeyen ana makine adı, ana makine yolu yok, yanıt yok). Bazı uygulamalar için farklı bayraklar gerekebilir (örneğin , FreeBSD -wyerine -W), sisteminizdeki kılavuza bakın.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi

Ben öyle biliyorum , ben sadece başka yollar garip ya kararsız ya sen ne sahip olsa bile, tek yol değildi umuyordum şekilde. Oh iyi!
user67459 18:15

2
Bu cevap yanıt olarak BELİRTİLMEMELİDİR answered. OP bu cevabın sağlayamadığı hususlar more ways to see if a given host is updışında özellikle sordu ping.
Ocak'ta Yokai

'Ping' man sayfasından:"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134

Bu paragraf daha iyi ifade edilebilirdi. Aşırı alarmist. Çok yüksek bir oranla sel ping veya ping yapmamalısınız, ancak şimdi ve sonra bir ping paketi ihmal edilebilir.
Gilles 'SO- kötü olmayı bırak

2

Ping, ana bilgisayarın ağa bağlı olup olmadığı hakkında hızlı bir yanıt almak için mükemmeldir, ancak genellikle ana bilgisayarın canlı olup olmadığını veya hala beklendiği gibi çalışıp çalışmadığını size söylemez. Bunun nedeni, ping yanıtlarının genellikle çekirdek tarafından ele alınmasıdır, bu nedenle sistemdeki her uygulama çökse bile (örneğin bir disk arızası veya belleğin tükenmesi nedeniyle), genellikle ping yanıtları alırsınız ve makinenin durum tam tersi olduğunda normal çalışır.

Hizmetleri kontrol etme

Genellikle bir ana bilgisayarın hala çevrimiçi olup olmadığını gerçekten önemsemezsiniz, gerçekten önemsediğiniz şey, makinenin hala bir görev gerçekleştirip gerçekleştirmediğidir. Dolayısıyla, görevi doğrudan kontrol edebiliyorsanız, ana bilgisayarın hem çalışır durumda olduğunu hem de görevin hala çalışmakta olduğunu bilirsiniz.

Örneğin, bir web sunucusu çalıştıran uzak bir ana bilgisayar için aşağıdakine benzer bir şey yapabilirsiniz:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

SSH çalıştırıyorsa ve şifresiz oturum açma için ayarlanmış anahtarlarınız varsa, örneğin birkaç seçeneğiniz daha vardır:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Bu, SSH'yi ana bilgisayara girerek ve truekomutu çalıştırarak ve ardından bağlantıyı kapatarak çalışır . sshO komut başarılı bir şekilde çalıştırılabilir eğer komut sadece başarıyı dönecektir.

SSH ile uzaktan testler

mysqldMakinede çalıştığından emin olmak gibi belirli işlemleri kontrol etmek için bunu genişletebilirsiniz :

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

Elbette bu durumda monit, hizmetin çalışmaya devam etmesini sağlamak için hedefte olduğu gibi bir şey çalıştırmaktan daha iyi olursunuz , ancak B makinesi buna hazır olduğu sürece yalnızca A makinesinde bazı görevleri gerçekleştirmek istediğiniz komut dosyalarında kullanışlıdır. .

Bu, hedef makinenin bir gerçekleştirmeden önce belirli bir dosya sistemine sahip olup olmadığını kontrol etmek gibi bir şey olabilir rsync, böylece ikincil bir dosya sistemi herhangi bir nedenden dolayı bağlanmadıysa yanlışlıkla ana diskini doldurmazsınız. Örneğin bu, /mnt/raiddevam etmeden önce hedef makineye monte edildiğinden emin olur .

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

İstemcisi olmayan hizmetler

Bazen servise bağlanmak için kolay bir yol yoktur ve sadece gelen TCP bağlantılarını kabul edip etmediğini görmek istersiniz, ancak telnetsöz konusu porttaki hedefe gittiğinizde orada oturur ve bağlantıyı kesmez, yani bunu yapmak anlamına gelir. bir komut dosyasında asılı kalmasına neden olur.

Çok temiz olmasa da, timeoutve netcatprogramları yardımıyla bunu hala yapabilirsiniz . Örneğin bu, makinenin TCP bağlantı noktası 445'te SMB / CIFS bağlantılarını kabul edip etmediğini kontrol eder, böylece oturum açmak için bir parolanız olmasa da CIFS istemci araçları çalışmıyorsa Windows dosya paylaşımını çalıştırıp çalıştırmadığını görebilirsiniz. ' t kurulu:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
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.