[PHP] Überprüfen ob ein Programm offen ist

  • Hallo,
    ich habe zur Zeit einen Mumble Server auf meinem Raspi laufen, den ich aber nur manchmal an habe. Nun wollte ich eine (vom Raspi gehostete) Webseite machen, auf der stehen soll ob gerade:
    -Hamachi an ist
    und auch ob
    -Mumble an ist
    das ganz soll dann folgendermaßen ausgegeben werden:

    Code
    Der Raspberry Pi ist [b]AN[/b]
    Hamachi ist [b]AN[/b]
    Mumble ist [b]AUS[/b]


    Das mit dem Raspberry Pi erledigt sich von selbser, da die Webseite eh nur verfügbar ist, wenn der Raspi an ist. Mein Problem ist nun, kriegt man es hin mit PHP/HTML/JavaScript zu schauen, ob ein bestimmtes Programm auf dem Raspberry Pi gerade läuft?

    01010111 01100101 01110010 00100000 01100100 01100001 01110011 00100000 01101100 01101001 01100101 01110011 01110100 00100000 01101001 01110011 01110100 00100000 01100100 01101111 01101111 01100110

  • Oh danke für die schnelle antwort, kannst du mir auch zufällig dabei ein bisschen weiterhelfen wie das dann geht?

    01010111 01100101 01110010 00100000 01100100 01100001 01110011 00100000 01101100 01101001 01100101 01110011 01110100 00100000 01101001 01110011 01110100 00100000 01100100 01101111 01101111 01100110

  • Ja die Doku hab ich auch schon gelesen aber irgendwie nicht verstanden... :D und bei Hamachi mache ich dann das ganze mit

    Code
    ps aux |grep hamachi|grep -v grep

    machen, aha!

    Naja google hat mir verraten, dass diese

    Code
    ps -fC einprogramm


    Weise besser ist :D muss ich mal ausprobieren

    01010111 01100101 01110010 00100000 01100100 01100001 01110011 00100000 01101100 01101001 01100101 01110011 01110100 00100000 01101001 01110011 01110100 00100000 01100100 01101111 01101111 01100110

    Einmal editiert, zuletzt von beecoopcool (5. September 2014 um 11:55)


  • liefert die PID eines Prozesses. Da kann man sich den grep sparen.
    Also z.B.:

    Code
    $ pidof hamachi


    Ja, aber nicht nur die PID sondern wie ps auch, auch (... bzw. wenn man die PID nach /dev/null schickt, nur) den Rückgabewert 0 (positiv) oder 1 (negativ). Dann muss man nicht auf die/den PID/String prüfen, sondern auf den Rückgabewert 0 oder 1.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo zusammen,

    mit

    Code
    pidof prozessname

    arbeite ich schon seit geraumer Zeit.

    Dieses Linux-Kommando ist eine feine Sache, da es die Prozess-IDs des entsprechenden Programmes liefert.

    Wenn man ein Programm geschrieben hat, das ein anderes Programm aufruft, das dann aber abstürzt, hat das (Vater-)Programm die Möglichkeit, die abgestürzten Kindprozesse über kill zzgl. des pidof-Ergebnisses "abzuschiessen".

    Letztens habe ich eine Anwendung geschrieben, die gezeichnete Bilder (Pixel-Graphiken oder Bi-Level-Graphiken) direkt in Programm-Code umwandelt, diesen compiliert und ausführt. Das Ergebnis erscheint dann als eigenständiges Programm auf dem Bildschirm.

    Man kann dieses neue Programm entfernt dort beenden - oder über das Graphik-Programm über einen Button, der erscheint, sobald das neue Programm gestartet wurde.

    pidof wird sich durchsetzen, da bin ich mir sicher.


    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (5. September 2014 um 12:17)

  • Habe selbst mehrere solcher Abfragen auf dem WebIf meines Pi laufen. Ich mach das immer mit pgrep, sieht dann so aus:

    PHP Teil:

    PHP
    <?php
    $output = array();
    $return_var = 0;
    exec("pgrep -c -x Programmname", $output3, $return_var3);
    ?>

    Im HTML Teil dann folgendes an gewünschter Stelle einfügen:

    PHP
    <?php
    if ($output[0] < 1)
    echo "  <b>Status:</b> Programmname is not running! </br></br>";
    if ($output[0] > 0)
    echo "  <b>Status:</b> Programmname is running and ready!</br></br>";
    ?>
  • Bei dem Code von driftmonster sehe ich leider ein paar Unstimmigkeiten - so wird zum Beispiel das zuvor gesetzt $output Array später garnicht mehr verwendet, das vorherige setzen von $output und $return_var ist aber auch überflüssig ;)
    Auch die anschließende Prüfung ist etwas seltsam..

    Es sollte eigentlich wie folgt aussehen:
    [code=php]
    $eRROR='';
    exec("pgrep -c -x Programmname", $output, $return_var);
    if ($return_var == "127") { $eRROR .= "<b>ERROR no such Script/Prog!</b><br/>\n"; }
    if (!empty($output)) { $eRROR .= "<br/>\n"; foreach ($output as $line) { $eRROR .= $line."<br/>\n"; } }
    if (!empty($eRROR)) { echo $eRROR; }
    [/php]


    Also ich bin ein Verfechter der altmodischen Methode über ps da man damit mehr machen kann ;)

    Habe in einem früheren, recht großen Projekt, ebenfalls eine Prozessprüfung in PHP eingebaut die dann via AJAX quasi in Echtzeit immer den aktuellen Status anzeigte sowie die Laufzeit des Prozesses... Aber übertreiben wirs hier erst mal nicht ;)


    Wenn du generell mehrere Prozesse überprüfen möchtest und ggf sogar eine Möglichkeit haben willst diese übers Webinterface neu zu starten usw, würde ich dir zum einen eine Forumsuche nach sudo webscript empfehlen und das zum Beispiel wie folgt umsetzen:
    (Buttons usw kannste dir da dann ja leicht einbaun)

    index.php

    Spoiler anzeigen


    [code=php]
    <?php
    //------------------------------------------------------------------------------
    $Programms = "Hamachi Mumble"; // exact Name of Processes without Path! Separate list with SPACE
    //------------------------------------------------------------------------------
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="robots" content="DISALLOW">
    <title>Process Control</title>
    <style>
    .tabred {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: firebrick;
    font-weight: bold;
    }
    .tabgreen {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: limegreen;
    font-weight: bold;
    }
    .tab {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: #c8c8c8;
    font-weight: normal;
    }
    </style>
    </head>
    <body>
    <div id='control'>
    <?php include_once("processes_info.php"); ?>
    </div>
    </body>
    </html>
    [/php]

    processes_info.php

    Spoiler anzeigen


    [code=php]
    <?php
    // (c) 2012 meigrafd

    CheckProcesses();
    Process_Uptime();

    echo "<div id='processes'>\n";
    echo "<table>\n";
    foreach ($ProcRUN AS $Proc => $pid) {
    echo "<tr>";
    if ($pid <> "") {
    echo "<td class='tabgreen'>$Proc</td>";
    if (isset($ProcessUptime[$Proc])) {
    echo "<td>&nbsp; uptime: ".$ProcessUptime[$Proc]."</td>";
    } else {
    echo "<td>&nbsp; - </td>";
    }
    } else {
    echo "<td class='tabred'>$Proc</td>";
    echo "<td>&nbsp; - </td>";
    }
    echo "</tr>\n";
    }
    echo "</table>\n";
    // Processes div - end
    echo "</div>\n";


    if (isset($_GET["UPDATE"])) { unset($_GET["UPDATE"]); }

    //------------------------------------------------------------------------------

    // Processes
    function CheckProcesses() {
    global $Programms,$ProcRUN;
    $ProcRUN=array();
    //$ProcRUN["Cron"]=exec("ps aux | grep -v grep | grep -w cron | awk {'print $2'}");
    $PA=explode(" ", $Programms);
    foreach($PA AS $Prog) {
    $ProcRUN["$Prog"]=exec("ps aux | grep -v grep | grep -w ".basename($Prog)." | tail -n1 | awk {'print $2'}");
    }
    }

    // Process's Uptime
    function Process_Uptime() {
    global $ProcRUN,$ProcessUptime;
    $ProcessUptime=array();
    foreach ($ProcRUN AS $Proc => $pid) {
    if ($Proc == "Cron") { continue; }
    if ($pid <> "") {
    $HZ=100;
    $p_seconds_since_boot = exec("cat /proc/".$pid."/stat 2>/dev/null|cut -d ' ' -f 22");
    $p_seconds_since_boot = intval($p_seconds_since_boot / $HZ);
    $boottime = exec("grep btime /proc/stat|cut -d ' ' -f 2");
    $p_starttime = intval($boottime + $p_seconds_since_boot);
    $now = time();
    $p_runtime = intval($now - $p_starttime);
    $ProcessUptime["$Proc"] = "".format_uptime($p_runtime)."";
    }
    }
    }

    // format the uptime in case the browser doesn't support dhtml/javascript
    // static uptime string
    function format_uptime($seconds) {
    $uptimeString="";
    $secs = intval($seconds % 60);
    $mins = intval($seconds / 60 % 60);
    $hours = intval($seconds / 3600 % 24);
    $days = intval($seconds / 86400);
    if ($days > 0) {
    $uptimeString .= $days;
    $uptimeString .= (($days == 1) ? " day" : " days");
    }
    if ($hours > 0) {
    $uptimeString .= (($days > 0) ? ", " : "") . $hours;
    $uptimeString .= (($hours == 1) ? " hour" : " hours");
    }
    if ($mins > 0) {
    $uptimeString .= (($days > 0 || $hours > 0) ? ", " : "") . $mins;
    $uptimeString .= (($mins == 1) ? " minute" : " minutes");
    }
    if ($secs > 0) {
    $uptimeString .= (($days > 0 || $hours > 0 || $mins > 0) ? ", " : "") . $secs;
    $uptimeString .= (($secs == 1) ? " second" : " seconds");
    }
    return $uptimeString;
    }

    ?>
    [/php]

    Wie das aussieht kannst du dir hier angucken: http://RaspberryPI.RoXXs.org/ps/
    Rot --> Prozess läuft nicht
    Grün --> Prozess läuft


    PS: Ich hab das in 2 Dateien gesplittet damits übersichtlicher ist (wie ich finde). Du kannst die 2. Datei aber auch an passender Stelle in die erste copy&pasten, is relativ egal solange du kein AJAX nutzen willst ;)

  • Ah danke, das sieht ja schon gut aus ich weiss das klingt jetzt doof, aber wie mache ich das dann mit den Knöpfen zum Neustarten? Danke für eure Hilfe :)

    01010111 01100101 01110010 00100000 01100100 01100001 01110011 00100000 01101100 01101001 01100101 01110011 01110100 00100000 01101001 01110011 01110100 00100000 01100100 01101111 01101111 01100110

  • Ich möchte ehrlich gesagt nicht alles vorkauen, ein bisschen solltest du schon selber machen - vorallem weil dann erst was gelernt wird ;)

    Frag Google wie man für HTML einen Button einbindet und benutz die Forumsuche nach sudo webscript - aus beidem solltest du dann eigentlich in der Lage sein eine Start/Stop/Restart Funktion selber einzubauen.

    Falls du dann noch Probleme haben solltest, helfe ich gerne - sofern ich sehe das Du auch bereit bist etwas für Dein Vorhaben zu tun :)

  • Hatte Langeweile und hab das mal für die Nachwelt zurecht gebastelt...


    index.php

    Spoiler anzeigen

    [/spoiler]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!