Uptime & php

Pagina: 1
Acties:

  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
(...na een zoektocht door de search toch dit topic...)

Ik wil 2 dingen: uptime in dagen weergeven van de webserver zelf en de uptime in dagen van een andere webserver.

de webserver zelf is bijna gelukt:

code:
1
2
$ uptime | cut -d"," -f1
 00:26:35 up 7 days


code:
1
2
$ uptime
 00:29:14 up 7 days,  4:18,  2 users,  load average: 1.04, 1.07, 1.07


in principe wil ik gewoon alleen de "7"... weet iemand hoe?

Voor mensen die dit ook willen een stukje PHP code:

PHP:
1
system('uptime');


of

PHP:
1
passthru('uptime');


Hoe doe ik dit nu voor de 2e webserver?

En stel dat die pagina erg vaak wordt geviewd, is het dan niet beter om de uptime met een omweg op te vragen, via cron in een txt zetten en deze laten includen ofzo?

  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Deltafox schreef op 04 June 2003 @ 01:34:
in principe wil ik gewoon alleen de "7"... weet iemand hoe?
# uptime |awk '{print $3}'
Hoe doe ik dit nu voor de 2e webserver?
Dan wordt snmp al snel interessant
En stel dat die pagina erg vaak wordt geviewd, is het dan niet beter om de uptime met een omweg op te vragen, via cron in een txt zetten en deze laten includen ofzo?
Als het echt vaak opgevraagd wordt dan is het idd interessant om het op de een of andere manier te cachen.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Je kunt met nmap een host scannen en de uptime opvragen:
maarten@Heaven:~$ sudo nmap -O 127.0.0.1 | grep Uptime
Uptime 16.248 days (since Sun May 18 17:59:51 2003)
Bijvoorbeeld....

En qua snelheid betreft, je zou een soort van polling kunnen toevoegen. Dus bijvoorbeeld zoals netcraft het meet, gewoon per dag. Dus een cron job laten draaien, eventueel de boel in een database of text file zetten en dat gebruiken.
Wat meer info (waar ik het ook van "geleend" heb ;)): http://lists.insecure.org...ev/2001/Jan-Mar/0005.html

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

Mja, uptime's output voor uptimes korter dan één dag is ook weer anders. Ikzelf heb in PHP gewoon iets geschreven dat /proc/uptime uitleest, parset en er de tijd in dagen, uren, etc, uit uitrekent. Nadeel is wel dat deze constructie specifiek is voor GNU/Linux (/proc/uptime is in andere OSsen niet aanwezig). Voordeel is dat het lichter is (file openen + lezen en enkele simpele berekeningen vs. het spawnen van een nieuw process), en exacter / voorspelbaarder.

Voor remote bakken zou je wat kunnen cronnen, en de output in een file gooien welke via FTP / HTTP / passwordless SSH / whatever beschikbaar is.
Alternatief kun je de uptime remote bepalen met nmap, maar dat moet je absoluut niet vanuit PHP gaan aanroepen, omdat dat te zwaar is en als root moet. nmap cronnen, en de output ergens neergooien waar hij vanuit PHP geparsed kan worden is evt nog een optie :)

Verwijderd

Naast de gebruik maken van de mogelijkheden die de *nix shell je biedt, kun je uiteraard ook de string-functies/reguliere expressies uit php gebruiken, om zodoende het uit te voeren commando zo minimaal mogelijk te houden.

I.p.v. cut/mawk zou je bijvoorbeeld op de volgende manier al het door jou gewenste resultaat krijgen in php:

PHP:
1
2
3
4
5
<?php
$uptime = exec(uptime);
preg_match('/(\d+)\ day/', $uptime, $matches);
echo 'Het aantal dagen up: '.$matches[1];
?>

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 07-05 19:45

Kees

Serveradmin / BOFH / DoC
waaaaaaarom zo moeilijk?
PHP:
1
2
3
4
5
<?
$uptime_raw = `cat /proc/uptime`; // kan ook met een fopen, is iets mooier
$uptime=explode(" ", $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";
?>


Als de pagina vaak opgevraagd wordt, maak je er een fopen van. Op dit forum wordt onder aan elke pagina ook een fopen gebruikt omde server te bepalen (/proc/sys/kernel/hostname) en tja, proc = functie aanroepen in de kernel, dus razend snel meestal.

De remote server kun je in principe hetzelfde voor doen, en dan met een fopen via http hem includen oid. (opslaan in een .txt bestand zal meer van de server vragen dan het uitlezen mbv uptime en/of /proc)

[ Voor 53% gewijzigd door Kees op 04-06-2003 02:19 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Kees, tegen wie heb je het nou?

Kweet niet wat moeilijker is in de ogen van iemand die nooit programmeert namelijk :o

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 07-05 19:45

Kees

Serveradmin / BOFH / DoC
Verwijderd schreef op 04 juni 2003 @ 02:17:
Kees, tegen wie heb je het nou?

Kweet niet wat moeilijker is in de ogen van iemand die nooit programmeert namelijk :o
Wel, ik heb het erover dat je moeilijk doet met regexps's en cut, awk, tr etc.. daar kan het ook mee, maar deze manier is veel simpeler :)

Je krijgt dan de uptime in seconden, het enige wat je dan nog hoeft te doeni s omrekenen :)

Het is nog beter ook, want als een server nog < 1 dag up is, moet je een compleet andere regexp gebruiken :)

[ Voor 12% gewijzigd door Kees op 04-06-2003 02:21 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
Kees schreef op 04 June 2003 @ 02:16:
waaaaaaarom zo moeilijk?
PHP:
1
2
3
4
5
<?
$uptime_raw = `cat /proc/uptime`; // kan ook met een fopen, is iets mooier
$uptime=explode(" ", $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";
?>
Dit is een mooi stukje code, erg nice!

Heb nu de volgende oplossing voor het complete probleem:

Om de server niet onnodig te belasten bij elke pageview wil ik dus wel gaan cashen. Heb op PHPfreakz weleens geconcludeerd dat je php ook in de commandline kunt gebruiken, dus als ik daarmee nu via een cron job elke dag de file laat updaten op beide webservers en die op 1 pagina includen.

Wat denken jullie daarvan?

Het zou natuurlijk ook mooi zijn dat de dagen meteen meeveranderen en niet bijv pas een halve dag later omdat de cron maar eens per dag loopt, elk uur checken zou dan kunnen natuurlijk...

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

De overhead valt erg mee hoor, als je gewoon /proc/uptime uitleest met fopen().

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 07-05 19:45

Kees

Serveradmin / BOFH / DoC
deadinspace schreef op 04 June 2003 @ 02:38:
De overhead valt erg mee hoor, als je gewoon /proc/uptime uitleest met fopen().
erger nog; ik durf te beweren dat dit sneller is dan uit een file lezen :)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Kees schreef op 04 juni 2003 @ 02:46:
[...]

erger nog; ik durf te beweren dat dit sneller is dan uit een file lezen :)
Yupz :) Ik denk zelfs dat het verschil aardig groot zal zijn.

B.t.w. je zei dat T.net ook iets dergelijks gebruikt voor het uitlezen van de hostname. Ben je ook ervan op de hoogte dat er sinds kort een sneller versie is om bestanden in te lezen naar een string dan middels fopen? Kan alleen zo niet op de naam komen.

Ff zoeken....

[edit]
http://www.php.net/manual/en/function.file-get-contents.php
Nog nooit getest; kwam het laatst ergens tegen. Misschien dat je ergens nog de laatse beetjes performance uit wil persen :+
edit:

B.t.w. dat die regex voor < 1 dag uptime niet klopt had ik inderdaad nog niet bij stilgestaan, maar goed ik tikte ook de eerst de beste code in die in mij opkwam na het zien van de aanpakken hier

[ Voor 30% gewijzigd door Verwijderd op 04-06-2003 02:57 ]


  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
Ok, als dat dan toch niet uitmaakt dan ga ik niet cashen :)

hmm volgens mij ben ik er dan ja :D

vet vet vet...

op de andere server zet ik hetzelfde script dan gewoon online (bijv: http://server.domein.nl/uptime.php) en include in het script op de andere server, dat moet werken :D

Wij danken u voor de hulp ;)

Verwijderd

Ik ben nu bezig even een klein testje te maken voor je wat de "zwaarte" is. Als je 1 minuut hebt, dan kan ik het je zeggen :P

code:
1
2
3
4
5
6
timings in seconden elke versie 1000x uitgevoerd binnen een loop:

Start:          0.000 0.000
Inlees versie:  7.573 7.573
Fopen Versie:   0.111 7.684
Totaal verstreken (s) voor 2000 loops:  7.684


Mjah fopen is maar een klein beetje sneller :+

[ Voor 64% gewijzigd door Verwijderd op 04-06-2003 03:04 ]


  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
Ok Nelske, als jij zegt dat fopen sneller gaat, gaan we dat natuurlijk gebruiken :)

PHP:
1
2
3
$uptime_raw = fopen ("/proc/uptime", "r");
$uptime=explode(" ", $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";


Bovenstaande code zegt: "Uptime is 0 dagen."

Deze code werkt dus niet, Nelske hoe heb jij het opgelost?

[ Voor 18% gewijzigd door Deltafox op 04-06-2003 03:53 ]


Verwijderd

Deltafox schreef op 04 June 2003 @ 03:27:
Ok Nelske, als jij zegt dat fopen sneller gaat, gaan we dat natuurlijk gebruiken :)

(misschien kun je wat uitleg geven bij je meetresultaat)
Ja hoor. Gewoon 2 maal een loopje aangemaakt wat 1000 maal doorlopen wordt.

In de 1e loop gebruik ik de cat manier zoals Kees hem gaf. In de 2e loop gebruik ik fopen (, fread en fclose). Verder laat ik niks uitvoeren. :)
PHP:
1
2
3
$uptime_raw = fopen ("/proc/uptime", "r");
$uptime=explode(" ", $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";


Bovenstaande code zegt: "Uptime is 0 dagen."

Deze code werkt dus niet, Nelske hoe heb jij het opgelost?
Dat is niet zo vreemd ;)
fopen doet niks anders dan de file openen waarbij de var een filepointer/handle is. Je zult hem ook nog moeten lezen en sluiten. Je code wordt dan zoiets:

PHP:
1
2
3
4
5
6
7
<?php
$fp = fopen('/proc/uptime', r);
$uptime_raw = fread($fp, 1024);
fclose($fp);
$uptime=explode(' ', $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";
?>

  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
PHP:
1
2
3
4
5
$fp = fopen('/proc/uptime', 'r');
$uptime_raw = fread($fp, 1024);
fclose($fp);
$uptime=explode(' ', $uptime_raw);
echo "Uptime is " . floor($uptime[0] / 86400) . " dagen.";


Officieel moet de r (van read) in fopen tussen enkele quotes staan, anders krijg je volgende melding (als je php op debug mode hebt staan ofzoiets)

code:
1
Notice: Use of undefined constant r - assumed 'r' in /home/klant2/www/test4.php on line 2


De 1024 in fread geeft het volgende aan:
fread() leest 1024 bytes van de bestands pointer waar $fp naar verwijst. Het lezen stopt als length bytes worden gelezen of als er een EOF (einde-van-bestand) optreed, welke ook als eerste komt.
bron: http://nl2.php.net/manual/nl/function.fread.php

[ Voor 60% gewijzigd door Deltafox op 04-06-2003 04:29 ]


Verwijderd

Deltafox schreef op 04 June 2003 @ 04:13:
Officieel moet de r (van read) in fopen tussen enkele quotes staan, anders krijg je volgende melding (als je php op debug mode hebt staan ofzoiets)
Klopt :) Komt omdat ik het zo intik ;)
De 1024 in fread geeft het volgende aan:
Die EOF wat End Of File betekent komt toch eerder ;)

Eventueel zou je nog de filesize functie kunnen gebruiken ipv 1024, maar eigenlijk heb je die helemaal niet nodig :)

  • Deltafox
  • Registratie: Augustus 2001
  • Laatst online: 26-12-2025
Verwijderd schreef op 04 June 2003 @ 04:27:
[...]

Die EOF wat End Of File betekent komt toch eerder ;)

Eventueel zou je nog de filesize functie kunnen gebruiken ipv 1024, maar eigenlijk heb je die helemaal niet nodig :)
1024 bytes lijkt me voldoende, motivatie:

$ cat /proc/uptime
630514.69 641.73

630514.69 = uptime in seconde
(641.73 blijft steeds hetzelfde, weet niet wat dat is)

630514.69 / 86400 = 7.30 dagen uptime
(86400 = 60sec*60min*24uur = sec in 1 dag)

Stel de server heeft een uptime van 365 dagen (jaar dus):

365 * 86400 = 31536000

samen met die 10 bytes die erachter nog komen, heeft het bestand /proc/uptime dan voor 18 bytes aan data, nog lang geen 1024 dus

(1024 bytes = 2,8538812785388127853881278538813e+1007 jaren :S)

Verwijderd

Yupz, daarom heb ik voor de zekerheid ook gewoon 1 KB als readsize opgegeven. Je zou het eventueel nog net wat meer kunnen optimaliseren door het 2e getal (tijd die in idle processen besteed is volgens man proc) buiten te sluiten (let wel op wat reserve voor het geval je machine lang aanstaat).

Maar goed, de winst daaruit is zo marginaal dat het nauwelijks nut heeft ;)

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
function getuptime($uptotsecs){
  $upsecs = $uptotsecs % 60;
  $upmins = (int)(($uptotsecs - $upsecs) / 60) % 60;
  $uphours = (int)(($uptotsecs - $upsecs - ($upmins * 60)) / 3600) % 24;
  $updays = (int)(($uptotsecs - $upsecs - ($uphours * 24)) / (3600 * 24));

  $string  = "$updays day" . ($updays == 1 ? ", " : "s, ");
  $string .= "$uphours hour" . ($uphours == 1 ? ", " : "s, ");
  $string .= "and $upmins minute" . ($upminute == 1 ? "" : "s");
  return $string;
}
?>


Hoe je $uptotsecs (uptime in seconden) krijgt is hierboven al uitgelegd. Gemaakt voor m'n netstats pagina, waar de uptimes van mijn machine en onze hp officejet worden weergegeven :)

All my posts are provided as-is. They come with NO WARRANTY at all.

Pagina: 1