Jump to content

Bash - ping


HTC
 Share

Recommended Posts

Sveiki, vajag nelielu palīdzību, īsti ar bash nedraudzējos līdz ar to esmu nonācis strupceļā, tātad, esošais kods:

#!/bin/sh
HOSTS="192.168.0.1"
DATE=$(date +"%Y-%m-%d")
TIME=$(date +"%T")
LOGFILE=/tmp/network.log
PING=`which ping`
log(){
message="$@"
echo $message >>$LOGFILE
}
pingojas()
{	
reachable=1;
log "$DATE | $TIME | Connected to internet"
while [ $reachable -eq 1 ];
 do
  sleep 2
  echo ping
  $PING $HOSTS > /dev/null 2>&1

  if [ "$?" -eq 1 ];
   then
	  reachable=2
	  nepingojas
   fi
done	
}
nepingojas()
{
reachable=2;
log "$DATE | $TIME | Lost internet connection"

while [ $reachable -eq 2 ];
 do
  sleep 4
  echo neping
  $PING $HOSTS > /dev/null 2>&1
  if [ "$?" -eq 0 ];
   then
	  reachable=1
	  pingojas
   fi  
done	
}
if [ -n "$HOSTS" ];
then
 log "$DATE|$TIME|Network monitoring system started!"
 $PING $HOSTS  > /dev/null 2>&1
if [ "$?" -eq 0 ];
 then
reachable=1;
   pingojas
 else
   reachable=2;
nepingojas
 fi																																	
else
 log "$DATE|$TIME|IP NOT FOUND!"
fi

 

par ping fju , pings tiek laists izmantojot busybox , paša pinga rezultātā atbilde ir tikai: "ip is alive!"

pingam nedarbojas -c -t un papildu parametri, strādā tikai "ping hosts"

 

Šajā skriptā tiek palaistas divas dažādas funkcijas kuras pārslēdzas momentos , kad pings pazūd vai parādas, bet ir problēma... pārslēgšanās notiek arī ja pazūd viena paka... nepieciešams uzskaitīt paku skaitu un ja zudušo skaits (pēc kārtas) lielāks par piem. 5 - vecam pārslēgšanos.

Precīzāk nepieciešams uzskaitīt rezultātus aiz $PING $HOSTS > /dev/null 2>&1 , šajā gadījumā, ja pingojas, tad "$?" ir 0 , savukārt ja "$?" ir 1 tad notiek pārslēgšanās. Nepieciešams uzskaitīt 0 atbildes konkrētā secībā lai var veikt pareizu pārslēgšanos.

 

Nop, tas nav mans mājas darbs, tas nav arī pasākums par kuru saņemtu skanošo - taisu savam dzelzim mājās, lai zinātu pēc loga kuros momentos zūd internets uz ilgāku laiku (ip lokālā ielikta pagaidām).

 

Izmēģināju daudzus variantus, bet sistēma ir stipri apgraizīta un neatpazīst dažādus loop'us. Sliktākā gadījumā uztaisīšu uz php, bet dotajā momentā domāju, ka nav jēgas taisīt uz php, ja to var izdarīt šeit.

 

Paldies :)

Labots - HTC
Link to comment
Share on other sites

Īsti nav skaidrs, kas tas par pingu, ko tas atgriež, kad hosts ir sapingots un, ko tas atgriež kad nav sapingots, cik reizes tas pingo hostu utt. Tāpat nav skaidrs, ja tu raksti, ka sistēma neatpazīst ciklus, bet skriptā taču tiek izmantots while cikls.

 

Respektīvi, ja pareizi esmu sapratis sāpi, tad tu vari ciklā 5 reizes palaist pingu un tad skaitīt cik rezies tas atgriež true vai false. PS pinga rezultāts $? var būt ne tikai 0 vai 1, bet arī, piemēram 2:

 

root@zbx:/# ping bad.host.lv; echo $?
ping: unknown host bad.host.lv
2

 

Tas gadījumā, ja tu IP adreses vietā ieraksti hostname

Link to comment
Share on other sites

mēģināšu atbildēt:

a) no konsoles pingojot atgriež tikai divus variantus: ip is alive! vai No response from ip , cits nemaz nav vajadzīgs

b) jā, šis cikls strādāja, uz linux kastes taisīju līdzīgu, bet sh failus pārkopējot uz šamo verķīti - neņēma pretī daudzus variantus kamēr nepārtaisīju uz šo variantu, nepareizi nodefinēju frāzi, ka nestrādā 'loopi'

c) ip adrese fiksētā līdz ar to citi varianti nav vajadzīgi, hostname netiks vadīts, tikai ip

d) hosts tiks pingots visu laiku (infinity loop) - šobrīd tā arī notiek tiklīdz palaižu failu uzreiz tiek nosūtīts pings- ja hosts atbild, tad pārslēdzas uz ping funkciju un pingojas līdz pazūd signāls, tiklīdz pazūd pārslēdzas uz otru funkciju līdz parādās.

 

Sāpe ir tā, ka jāsagrupē rezultāts jo šobrīd pārslēgšanas notiek ja neaiziet viena paka un otrādi , nepieciešams pielikt papildu funkciju, kas uzskaita secībā esošos rezultātus, piem. ja 5 secīgi rezultāti pēc kārtas ir nulles tad neko nedaram, ja visi pieci ir vieninieki tad veicam pārslēgšanos. Zem php tur varētu visu samest array'os, ātri visu saskaitīt un .t.t. , bet te nevaru īsti iedomāties jo, kā jau teicu, no sh īsti daudz neko nezinu :/

 

 

Būtu ļoti vienkārši ja varētu norādīt sūtāmo paku skaitu un lielumu, bet to izdarīt nevar :(

 

/ # ping 192.168.0.1;echo $?
192.168.0.1 is alive!
0

Labots - HTC
Link to comment
Share on other sites

uz tās kastes ir pieejams bash? Ja ir tad, nomaini shebangu uz #!/bin/bash jo sh atbilst visiem posix standartiem, kuros nav definētas daudzas bash built-in funkcijas.. ja gribi, lai būtu pieejamas visas bash funkcijas, tad tas skripts ir jālaiž bash čaulā

Link to comment
Share on other sites

mda, tā arī domāju, ka nepareizi esmu sapratis atšķirību starp sh un bash ... bash nav pieejams:

Currently defined functions:
	[, [[, addgroup, adduser, ash, basename, busybox, cat, chmod,
	chown, chroot, clear, cp, cut, date, dd, delgroup, deluser, devfsd,
	df, dirname, dmesg, du, e2fsck, echo, egrep, eject, expr, false,
	fdisk, fgrep, find, free, fsck, fsck.ext2, fsck.ext3, ftpget,
	ftpput, getopt, grep, gzip, halt, head, hexdump, hostname, hwclock,
	id, ifconfig, init, insmod, ipcrm, ipcs, kill, killall, klogd,
	linuxrc, ln, logger, login, losetup, ls, lsmod, lzmacat, mkdir,
	mke2fs, mkfs.ext2, mkfs.ext3, mkfs.extk, mknod, mkswap, mktemp,
	modprobe, more, mount, mv, netstat, nice, passwd, pidof, ping,
	pivot_root, poweroff, printf, ps, pwd, rdate, readlink, reboot,
	rm, rmdir, rmmod, route, sed, sh, sleep, sort, stty, swapoff,
	swapon, sync, syslogd, tail, tar, tee, test, time, touch, tr,
	true, tune2fs, udhcpc, udhcpd, umount, uname, unlzma, unzip, uptime,
	usleep, vi, wc, wget, which, yes

 

Hmm, tad jau topika nosaukumā bash uz posix jānomain ... hmm, googlējot pēc posix sāku atrast jau kautkādus risinājumus, kas pēc sintakses ir līdzīgi, iespējams pats atrisināšu :p , bet tikai iespējams...

Labots - HTC
Link to comment
Share on other sites

cat: /etc/shells: No such file or directory ,tāpat caur find neatrod ne failu ne direktoriju :p

Labots - HTC
Link to comment
Share on other sites

nu tad es tavā vietā mēģinātu iekš tā paša while cikla laist to pingu un tad skaitīt nulles un vieniniekus..

Link to comment
Share on other sites

Laikam izdomāju risinājumu, bet nezinu vai pareizs un nezinu kā vēl pareizi uzrakstīt.

pašā sākumā nodefinējam mainīgo, piem.: ping_count=5

tad pinga laikā izvedojam loop no 1-5 , ja pinga rezultāts 1=0 un 2=0 un 3=0 un 4=0 un 5=0 , palaižam vēlreiz šo funkciju ja visas vērtības vienāds ar 1 tad pārslēdzamis...

 

 

Par ilgu rakstīju, uzspēji :D

Labots - HTC
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...