at-Daemon mit PHP ansprechen

Bash, Shell, PHP, Python, Perl, CGI
kane
Posts: 82
Joined: 2002-10-04 01:22

at-Daemon mit PHP ansprechen

Post by kane » 2005-03-10 16:44

Hi @ all!

Ich habe ein Problem mit der Ansteuerung des AT-Daemons über PHP.

Vorab mein Vorhaben:

Ich möchte eine Datei zu einem bestimmten Zeitpunkt einmal ausführen lassen. Der User kann über ein WebFrontEnd den genauen Zeitpunkt festlegen. Des Weiteren soll er auch diesen Job jederzeit wieder entfernen können.

Ich habe es mittlerweile soweit gebracht, dass ich über PHP den AT-Job eintragen kann

Code: Select all

exec("/usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05", $arr_output);
Wenn ich das auf der Console eingeben, bekomme ich folgende Ausgabe:

Code: Select all

server:/usr/bin # /usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05
warning: commands will be executed using /bin/sh
job 28 at 2005-04-10 10:50
Da der User aber nachher über das WebFrontEnd diesen Job (sofern noch nicht ausgeführt) löschen können soll, benötige ich die ID, also in diesem Fall die 28... Diese schreibe ich dann in die DB, so dass ich mit einem "at -r ID" diesen Job löschen kann (das funzt auch, wenn ich die ID kenne, über PHP).
Das Problem ist, dass ich über $str_output nichts zurückbekomme...
Habe auch shell_exec probiert, bekomme aber auch nix...
Auch wenn ich das Ergebnis in eine Datei schreiben will ist diese leer

/usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05 > file.txt

safe_mode ist off (sonst würd ich ja nix eintragen können :) )
Der Vollständigkeit halber hier noch ein atq (Queues)

server:/usr/bin # atq
28 2005-04-10 10:50 a root

Habe schon gegoogelt aber nichts dazu gefunden.
Vielleicht weiß jemand von euch, wie ich das bewerkstelligen kann...

LG und danke!

Kane

[tom]
RSAC
Posts: 671
Joined: 2003-01-08 20:10
Location: Berlin

Re: at-Daemon mit PHP ansprechen

Post by [tom] » 2005-03-11 01:57

Kane wrote:/usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05 > file.txt
Hmm - und was bekommst Du bei einem

Code: Select all

/usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05 &> file.txt
Sollte mich zwar wundern, wenn das klappt, aber wenn Du da nix in file.txt stehen hast, dann wird vermutlich nicht an die Filedescriptoren geschrieben. Oder at benötigt einen Parameter für STDOUT.


[TOM]

[tom]
RSAC
Posts: 671
Joined: 2003-01-08 20:10
Location: Berlin

Re: at-Daemon mit PHP ansprechen

Post by [tom] » 2005-03-11 02:00

'man at' wrote:-c cats the jobs listed on the command line to standard output.
Damit sollte es gehen.


[TOM]

kane
Posts: 82
Joined: 2002-10-04 01:22

Re: at-Daemon mit PHP ansprechen

Post by kane » 2005-03-11 08:12

Hi!

Danke für die schelle Antwort.
Leider klappt das nicht...
Wenn ich &> file.txt mache trägt er den Job überhaupt nicht ein.
Den Parameter -c kann ich nur ausführen, wenn ich die JobID habe. Beim Anlegen hilft mir -c nicht weiter.
Bei einem at -c [JOBID] bekomme ich nur den Inhalt der Datei, die unter /var/spool/atjobs liegt...
Wie gesagt, ich benötige nach dem Anlegen direkt die eingetragene JobID

Weiß sonst noch jemand einen Lösungsansatz?

Danke und Gruß Kane

kane
Posts: 82
Joined: 2002-10-04 01:22

Re: at-Daemon mit PHP ansprechen

Post by kane » 2005-03-11 10:47

Soooo, ich habe es jetzt folgendermaßen gelöst:

Code: Select all

  exec("/usr/bin/at -f /pfad/meinscript.sh 10:50 04/10/05", $arr_output);
  exec("/usr/bin/atq", $arr_output);
  for($i=0; $i<count($arr_output); $i++)
    {
    $arr_output[$i] = str_replace("t", " ", $arr_output[$i]);
    $arr_string = explode(" ", $arr_output[$i]);
    for($a=0; $a<count($arr_string); $a++)
      {
      // 0 = JobID
      // 1 = Datum
      // 2 = Uhrzeit
      // 3 = batch-Queue
      // 4 = User
      $arr_string[0][$i] = $arr_string[0];
      $arr_string[1][$i] = $arr_string[1];
      $arr_string[2][$i] = $arr_string[2];
      $arr_string[3][$i] = $arr_string[3];
      $arr_string[4][$i] = $arr_string[4];
      }
    for($b=0; $b<count($arr_string[0]); $b++)
      {
      if(trim($arr_string[1][$b]) == "2005-04-10" && trim($arr_string[2][$b]) == "10:50" && trim($arr_string[4][$b]) == "wwwrun")
        {
        echo "JOB ID ".$arr_string[0][$b];
        }
      }
    }
Es ist zwar nicht die feine "englische" Art :) aber so bekomme ich zumindest die ID wieder. Ein Problem könnte nur werden, wenn 2 Jobs am gleichen Tag zur gleichen Uhrzeit ausgeführt werden... dann ist das sicherlich ein Problem die richtige ID zu bekommen. Das könnte man aber über einen zusätzlichen Eintrag in der DB und dessen Prüfung beim Eintragen des Jobs abfangen...

Trotzdem würde ich gerne wissen, ob es nicht doch noch eine Möglichkeit gibt, die ID direkt beim Eintragen zu bekommen, und nicht wie im Script erst die Queue auswerten muss...

Gruß Kane

=> Bitte diesen Thread noch nicht schließen! :)

viper`at
Posts: 7
Joined: 2004-01-02 19:54

Re: at-Daemon mit PHP ansprechen

Post by viper`at » 2005-04-30 13:34

also ich hab deine variante versucht, und dein script naja, bissl lang und unnötig?

Code: Select all

<?

  exec("cd /pfad/zum/script/ && at -f datei 15:00 30.04.05");
  exec("/usr/bin/atq", $arr_output);

  for($i=0; $i<count($arr_output); $i++)
    { 
       $arr_output[$i] = str_replace("t", " ", $arr_output[$i]);

       $arr_string = explode(" ", $arr_output[$i]); 
 
           if(trim($arr_string[1]) == "2005-04-30" && trim($arr_string[2]) == "15:00" && trim($arr_string[4]) == "wwwrun")

            { 
            echo "<b>JOB ID </b>".$arr_string[0];
            } 

  }

?>

kane
Posts: 82
Joined: 2002-10-04 01:22

Re: at-Daemon mit PHP ansprechen

Post by kane » 2005-04-30 15:50

Hi!

Ich habe in meinem letzten Post einen kleinen Fehler im Script :)
Hier ist es nochmal, diesmal funktionierts auch :)

Code: Select all

  exec("/usr/bin/at -f /gueltiger_pfad_zum_script/script.sh 10:50 05/10/05", $arr_output); 
  exec("/usr/bin/atq", $arr_output); 
  for($i=0; $i<count($arr_output); $i++) 
    { 
    echo $arr_output[$i] = str_replace("t", " ", $arr_output[$i]); 
    $arr_string = explode(" ", $arr_output[$i]); 
    for($a=0; $a<count($arr_string); $a++) 
      { 
      // 0 = JobID 
      // 1 = Datum 
      // 2 = Uhrzeit 
      // 3 = batch-Queue 
      // 4 = User 
      $arr_string2[0][$i] = $arr_string[0]; 
      $arr_string2[1][$i] = $arr_string[1]; 
      $arr_string2[2][$i] = $arr_string[2]; 
      $arr_string2[3][$i] = $arr_string[3]; 
      $arr_string2[4][$i] = $arr_string[4]; 
      } 
    for($b=0; $b<count($arr_string2[0]); $b++) 
      { 
      if(trim($arr_string2[1][$b]) == "2005-05-10" && trim($arr_string2[2][$b]) == "10:50" && trim($arr_string2[4][$b]) == "wwwrun") 
        { 
        echo "<br><br>";
        echo "JOB ID ".$arr_string2[0][$b]; 
        } 
      } 
    }
Gruß Kane