Tarih&saat çıktılı ping

Başlatan srgnaras, 08 Şubat 2019 - 02:34:18

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

srgnaras

Merhaba millet, bir süre evvel çalıştığım şirkette fiber interneti değiştirdiğimizde internet ile ilgili bir sorun olmuş ve internetin ne zaman düştüğünü tespit etmek için saat ve tarih içeren ping komutu ile keşfetmeye çalışmıştık ancak bu o zaman olmamıştı. Ben şu an o şirketle çalışmıyorum ancak bash scripting işine ne zaman girsem aklıma geliyor. Şimdi tekrar ediyorum da aklıma geldi ve buradan da yardım alabileceğimi düşünüyorum.


#!/bin/bash

kosul=1
while [ $kosul -eq 1 ]
do
echo "$(date) ----- $(ping -c 1 8.8.8.8 | head -2 | tail -1)"
read kosul
if $kosul == "q"
then
$kosul=0
else
$kosul=1
fi
done


Benim yazdığım kod bu ancak hata vermemesi gerektiğini düşündüğüm yerlerde hata veriyor. Bu sorunu nasıl çözebilirim?
En zengin insan en güçlü arkadaşlara sahip insandır.

mhmtkrktr

Kesintilerin tam zamanını öğrenmek için, servis sağlayıcısını aramak yeterli olur sanıyorum. Orada bununla ilgili detaylı log tutuluyor. (tutmayan varsa onu bilmiyorum)
Senin betiğin ne yapmaya çalıştığını anlayamadım ama bununla ilgili basit birşeyler oluşturmaya çalıştım.

Not: Bu betik "Tekrar Bağlandı" mesajını alana kadar döngü oluşturacaktır.
#!/bin/bash

_xdevice=`LANG=C ip -o link show | awk -F': ' '/state UP/{print $2}'`

_xtime() { echo -e " ${1}\t----------\t`date +%c`" >> pingtest.txt ;}

_xping() { ping -q -c 1 -W 1 firefox.com &>/dev/null && echo 1 || echo 0;}

  for (( t=1; t<=5; t++ )); do

if (( `_xping` )) ; then T=1 ;  _xtime "\n$_xdevice ile Test Başladı"

  while true ;do (( ! `_xping` )) && { _xtime "\t\t  Bağlantı Kesildi " ; break ;} ; sleep 2 ; done
  while true ;do (( `_xping` )) && { _xtime "\t\t  Tekrar Bağlandı " ; break ;} ; sleep 2 ; done

  ((T)) && { tail -3 pingtest.txt | awk '{sub(/^[ \t]+/, ""); print}' ; break ; } ; fi

  done

  (( T )) || echo "Bağlantı bulunamadı ! Test iptal edildi."

srgnaras

Hocam merhabalar, cevabın sizden geleceğini biliyordum dün gece boyunca forumdaki "Kabuk" başlığı(sadece birinci sayfadaki konulara bakabildim) altında hep sizi gördüm. Evvela durumu açıklayayım. Firma adı vermeyeyim sonra sorun olabilir.

Biz çalıştığımız yerde bir firmadan fiber internet alıyorduk ancak aralıklarla şubelerle vpn bağlantısı kopuyordu. Bunun için daha büyük bir şirket ile anlaştık, o firma geldi switch'lerini bırakıp gerekli ayarlarını yaptıklarını söylediler ancak biz ne zaman switch'i firewall'a bağlasak internet bir süre çalışıp sonra kendi kendine düşünyor ve bu da vpn bağlantısını etkiliyordu. Ancak eski firmaya döndüğümüzde bu kopmalar olmuyordu. Bunu kanıtlamak için ne zaman düştüğünü bulmak adına ping testi yapıyorduk. Bu arada bizim loglarımızla fiber sağlayıcısının logları tutmuyordu.

Ya özetle orada bir gıcıklık vardı ve bunu ispatlamak adına da böyle bir şey yapmıştık.

------------

Ben yazmaya çalıştığım komutta "tarih saat + ping" sürekli döndermesini ve "q" tuşu ile çıkmasını hedeflemiştim ancak düşündüğüm gibi çalışmadı. Sizin kod ise bağlantının koptuğu ve tekrar bağlandığı zamanı veriyor. Bu da güzel ancak tam olarak benim istediğim şey değil.



En zengin insan en güçlü arkadaşlara sahip insandır.

mhmtkrktr

Onların kayıtları ile sizinkinin uymaması, farklı zaman birimlerini kullanmanız olabilir belki.
date +%X
date --utc +%X
gibi. Veya onların bakmadığı modem sonrası bir sorun olabilir.

Betiği her ping işlemini gösterecek şekilde değiştirebilirsin. Terminal penceresinin kaydırma sınırını düşününce, o şekilde kullanışlı olacağını düşünmedim.
q ile çıkış yapabilir, betiği ping atacağın adresle çalıştırabilirsin.

#!/bin/bash

_xdevice=`LANG=C ip -o link show | awk -F': ' '/state UP/{print $2}'`

_xlink="$1" ; [[ $_xlink ]] || _xlink='firefox.com'

_xtime() { echo -e "${1}\t----------\t`date +%c`";}

_xping() { ping -q -c 1 -W 1 $_xlink &>/dev/null && echo 1 || echo 0;}

  trap 'echo -e "\e[0m"' 0 1 2 3 15

  if [[ $_xdevice ]]; then

while [[ $REPLY != q ]]; do
if (( `_xping` )) ; then _xtime "\033[0;34m\n Test Başladı $_xdevice "

while true; do read -t 2 -n 1 ; [[ $REPLY =~ q ]] && exit 0
(( ! `_xping` )) && { _xtime "\033[0;31m Bağlantı Kesildi "; break ;} ; done

while true ;do read -t 2 -n 1 ; [[ $REPLY =~ q ]] && exit 0
(( `_xping` )) && { _xtime "\033[0;36m Tekrar Bağlandı "; break ;}  ; done
else
((T)) || _xtime "\033[0;32m $_xlink Başarısız " ; T=1 ; read -t 3 -n 1
fi
done

  else
_xtime "\033[1;31m Aygıt bulunamadı "
  fi

srgnaras

Olabilir hocam, onlar switch üzerindeki logların saatlerini bana söylüyorlardı bense testlerimi switch'e bağlı bir bilgisayarda yaptığım için o bilgisayarın saatlerine göre döbüt alıyordum.

Terminal penceresinde kaydırma sınırı olduğunu bilmiyordum. Öğrenmiş oldum. xping içerisindeki komutta çıktıların /dev/null'a gönderildiği kısımı kaldırırsam çıktıları alabilirim diye düşünüyordum ancak yollanan paketlerin toplamına ait bir istatistik veriyor. Sanırım bunun için farklı bir aksiyon almam gerek..

Betik içerisinde ne işe yaradığını bilmediğim/anlamadığım bazı yerler var hoca rica etsem açıklayabilir misiniz?

Eğer cevap evetse( ;D) sorularım;

  trap 'echo -e "\e[0m"' 0 1 2 3 15

if (( `_xping` )) ; then _xtime "\033[0;34m\n Test Başladı $_xdevice "
Sanırım `` arasına yazılanlar aynı zamanda $ işareti ile yazabileceğimiz değişkenler.. ve ekrana yazdırma yaptığımız kısımdaki \033[0;34m sanırım renk kodu(?)

((T))
Hiçbir fikrim yok





En zengin insan en güçlü arkadaşlara sahip insandır.

mhmtkrktr

Alıntı Yaptrap 'echo -e "\e[0m"' 0 1 2 3 15

Trap = tuzak komutu.
3 bölümden oluşur.
* komutun kendisi
* çalıştırılacak komut veya fonksiyon
* çalıştırılacak komutun hangi çıkış sinyalinde etkin olacağı.

Çıkış sinyali = her uygulama çıkış yaparken, çıkış sebebine bağlı bir çıkış sinyali oluşturur. Örn:
* terminal uygulaması çalışırken, CTRL+C ile durdurma
* terminal uygulaması çalışırken, CTRL+Z ile sonlandırma
* uygulamanın normal şekilde, kendi sürecini tamamlaması
* uygulama içinde öngörülemeyen hata oluşması
* uygulama içinde olasılığı görülmüş bir hata oluşması ve bunun için özel çıkış sinyali oluşturulması
* başka bir terminalden kill -3 ile durdurulması
* başka bir terminalden kill -9 ile tüm süreçleriyle öldürülmesi
gibi daha birçok duruma göre çıkış durumunu belirten bir sinyal üretilir. Bu listenin argümanlarını ve sayısal karşılıklarını trap -l komutu ile görebilirsin. Sinyal değerleri rakam veya alfabetik olarak yazılabilir.

Birkaç örnek;
Sonsuz döngü oluşturan bu komutu CTRL+C ile durdurursan, durdurduğun yerde echo -e "\ntrap test" komutu çalışacaktır. Çünkü ctrl+c (2) INT sinyali gönderecektir ve bu komut, döngüden önce tuzaklanmıştır.
trap 'echo -e "\ntrap test INT"' 2; C=0; while :; do sleep .5; echo $C; C=$((C+1)); done

Hata durumu için tuzak (gerçekte var olan bir dosya ile de deneyebilirsin)
trap 'echo -e "\ntrap test"' ERR; rm ${RANDOM}-deneme.txt

Süreç akışı için tuzak
trap 'echo -e "\ntrap test"' CHLD; C=0; while :; do sleep .5; echo $C; C=$((C+1)); ((C==6)) && break; done

Not: trap komutunu betiğin belirli bir yerinde devredışı bırakmak istersen, komutu ilgili sinyalle komutsuz olarak vermek gerekir.
0(EXIT) tuzağı kurulmuş ise
komut ...
trap 'komut' 0
komut ..
komut ..
trap 0 #veya trap EXIT
komut ....
gibi.

Alıntı YapSanırım `` arasına yazılanlar aynı zamanda $ işareti ile yazabileceğimiz değişkenler
Değil.  :)
Değişken, $değişken_adı veya ${değişken_adı} şeklinde belirtilir. `komut` ise $(komut) ile aynıdır ve içeriğin komut olarak çalışacağını belirtir.
echo `ls -d ~`
echo $(ls -d ~)
gibi. (bash fonksiyonları da komut gibi çalışır)

Alıntı Yap\033[0;34m sanırım renk kodu
Doğrudur.
Kullanılan terminal 8 lik renk desenini destekliyorsa \033[0;34m şeklinde, 256 renk desenini destekliyorsa \e[38;05;251m" gibi farklı varyasyonlar da yazılabilir. ncurses tarafından sağlanan tput setaf\setab komutu da aynı iş için kullanılabilir. 
Kullanılan terminalin renk deseni için;
echo ${TERM//[!0-9]}

Alıntı Yap((T))
Hiçbir fikrim yok
Bash ile bir şeyler yazmak istiyorsan işe bu konuda fikir edinme ile başlayabilirsin.  :D

(()) = sayısal kontrol rafı (alfabetik değerler kullanılamaz)
[[]] = sayısal ve alfabetik kontrol rafı
T = kontrol edilecek değer

* (()) sayısal raf da, değişkenlerin $ ile belirtilmesi gerekmez. Bu şekilde daha sade yazılmaya olanak verir.
* sayısal raf da, değişkene hiç değer atanmamış ise değeri 0 olarak kabul edilir ve 0 olumsuzluk oluşturan değerdir.
* ((! 0)) şeklinde olumsuzluk, olumluya dönüştürülebir. Yani ((! değer)) şeklinde her durum tersine çevrilebilir.
* ((D1 == D2)) , ((D1 > D2)) , ((D1 < D2)) şeklin de eşitlik, büyüklük , küçüklük durumu kontrol edilebilir.

Örn:
((SAYI)) && echo "Sayı atanmış $SAYI" || echo "sayı atanmamış"
SAYI=0
((SAYI)) && echo "Sayı atanmış $SAYI" || echo "sayı atanmamış"
SAYI=7
((SAYI)) && echo "Sayı atanmış $SAYI" || echo "sayı atanmamış"
((SAYI > 5)) && echo "Sayı 5 den büyük" || echo "sayı 5 den küçük"
((SAYI == 3)) && echo "Sayı 3 e eşit" || echo "sayı 3 e eşit değil"

Aynı kontrol [[]] ile de yapılabilir ve yazımı şu şekilde olabilir.
SAYI=3
[[ $SAYI -eq 3 ]] && echo "Sayı 3 e eşit" || echo "sayı 3 e eşit değil"


Bash da en çok kullanılan işlemlerden biridir ve en çok kaynağı bulunan, ilk öğrenilmesi gereken konudur diyebilirim. Kullanım şekilleri ise burada, tek bir başlıkta örneklendiremeyeceğim kadar uzun olur sanıyorum.

srgnaras

Hocam elinize sağlık "bilale anlatır gibi" anlatmışsınız :)

Bash programlama ile ilgili üniversitelerin çıkardığı ve linux belgelerini okudum ama arasında (()) görmemiştim. Bash'de aşırı derin şeyleri yazmayı planlamıyorum sadece bir gün ihtiyacım olur diye öğrenmek istiyorum. Bu konuyla ilgili kaynaklar birbirini hep tekrar ettiği için pek ilerleyemiyor insan(hele ki ingilizcesi zayıfsa).. sizin bu konuyla ilgili yazdığınız yazı yahut önerebileceğiniz yerler var mı?

Tekrar yardımınız için teşekkür ederim.
En zengin insan en güçlü arkadaşlara sahip insandır.

mhmtkrktr

 :D
Rica ederim.
Yazım veya önerebileceğim bir yer yok malesef. Ancak, temel seviye için yeterli Türkçe kaynak var. İşin ayrıntısına girmek istersen, söylediğin gibi, kaynaklar birbirini tekrar eder duruma geliyor.
Yalnız şunu da ekleyeyim, bash'ın nasıl işlediğini (temelini) kavrayınca, kaynağın yerli veya yabancı olmasının çok bir anlamı kalmıyor. Birçok komutu ve kullanım şeklini, açıklamasını okumadan, sadece basit örneklerine bakarak öğrenmek mümkün.