Executer une commande linux via le PHP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Executer une commande linux via le PHP

Re: Executer une commande linux via le PHP

par Themiller » 25 oct. 2012, 01:40

Merci beaucoup de ta patience :p Je vais essayer ça ;)

Re: Executer une commande linux via le PHP

par xTG » 22 oct. 2012, 18:42

// Exemple d'exécution
$pid = PsExecute("/var/www/xaseco/Aseco.sh");
if( $pid === false )
  echo "échec";
else
  echo "Réussite, son PID est : $pid";

Re: Executer une commande linux via le PHP

par Themiller » 22 oct. 2012, 01:12

Je vois ce que tu veux dire ^^ Mais j'ai l'impression d'avoir tout essayé et je n'y arrive pas.. :'( Tu pourrais me donner un exemple avec le chemin : /var/www/xaseco/aseco.sh s'il te plait ? Si ce n'est pas trop ^^

En attendant j'ai fais ce code, il marche mais c'est pas genial quoi x) :

Pour arreter :
<?php
if (isset($_POST['stop']) && $_POST['stop'] == 'Stop') {
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=pid', 'root', '*********', $pdo_options);

    
    $reponse = $bdd->query('SELECT pid FROM pid ORDER BY ID DESC LIMIT 0, 1');
	
    
    while ($pid = $reponse->fetch())
{
$intPID = $pid['pid'];
exec("kill $intPID");
echo '<br />Vous voulez maintenant relancer Xaseco ? <a href="test.php">Cliquez ici !</a> <br /> Si vous n\'avez pas encore fait de modifications et si vous souhaitez en faire avant de le relancer, alors <a href="control.php">cliquez ici !</a>';
}
$reponse->closeCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
}

else {
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=pid', 'root', '*********', $pdo_options);

    
    $reponse = $bdd->query('SELECT pid FROM pid ORDER BY ID DESC LIMIT 0, 1');
	
    
    while ($pid = $reponse->fetch())
{
 echo 'Le numéro actuel (PID) de Xaseco est : ',$pid['pid'];
 }
  $reponse->closeCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

 echo '<h3>Pour éteindre Xaseco cliquez ci-dessous !</h3> <br /> <br />  <form method="post" action="stop.php">
<input type="submit" name="stop" value="Stop" />'; }
?>
Et pour demarrer :
<?php

if (isset($_POST['suivant']) && $_POST['suivant'] == 'Suivant') {

header('Location: restarted.php');
}
else
{

if (isset($_POST['start']) && $_POST['start'] == 'Start') {

 $result = shell_exec ('/var/www/xaseco/Aseco.sh');
 echo 'Xaseco a été relancé avec succès ! Sin PID est le suivant :', $result, '<br /> <br />  <form method="post" action="test.php">
<input type="submit" name="suivant" value="Suivant" />';

try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=pid', 'root', '*******', $pdo_options);
    

    $req = $bdd->prepare("INSERT INTO pid (pid) VALUES('$result')");
    $req->execute(array($_POST['suivant']));
   
   }
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
}

else {

 echo '<h3>Pour lancer Xaseco cliquez ci-dessous !</h3> <br /> <h1><u>ATTENTION </u>: Vous devez avoir fermé Xaseco une première fois avant de le relancer ! Si ce n\'est pas le cas, cliquez <a href="stop.php">ici</a> !</h1> <br /> <br />  <form method="post" action="test.php">
<input type="submit" name="start" value="Start" />';
}
}

 
  ?> 

Re: Executer une commande linux via le PHP

par xTG » 16 oct. 2012, 11:32

Non, faut pas confondre définition et appel de fonction.
// définition
function foo($bar = 1){ // valeur par défaut de $bar sera 1 si non renseignée
  return $bar;
}

// appel
echo foo(2); // 2
echo foo(); // 1

Re: Executer une commande linux via le PHP

par Themiller » 15 oct. 2012, 21:19

Ah d'accord merci :D mais par exemple pour donner le lien vers mon script ?
Comme ceci ?
PsExecute($command=/var/www/xaseco/Aseco.sh, $timeout = 60, $sleep = 2)

Re: Executer une commande linux via le PHP

par xTG » 15 oct. 2012, 20:09

L'explication de ton problème déjà : PHP lance un nouveau shell à chaque fois que tu exécutes une commande, donc tu ne pointes jamais sur le même processus.

Maintenant le code (que je me copie dans un coin d'ailleurs, vachement bien...), la première fonction permet de lancer un exécutable avec un timeout, à savoir que la fonction va être bloquante tant que le processus tourne ou bien que le timeout n'est pas atteint. Ensuite si le processus tourne encore il est tué.
La seconde fonction te permet de lancer un exécutable et de récupérer son pid.
La troisième vérifie l'existence d'un processus en cherchant son pid.
Et la dernière tue un processus via son pid.

Executer une commande linux via le PHP

par Themiller » 15 oct. 2012, 19:11

Bonjour à tous (et à toutes peut etre) ! :D Mon message est considéré comme du spam alors qu'il n'y a pas de lien dedans.. Donc je vais essayer de le poster petit à petit x)

J'ai passé plusieurs heures à parcourir les forums mais à chaque fois les réponses sont soient sans réponse soient différente de ce qui me concerne..
Ce que je voudrais, c'est de pouvoir via un bouton ou n'importe quoi sur une page en php, arreter,redemarrer,lancer un script en .sh sur un serveur linux bien sur. Le GROS problème (sinon j'avais déjà ma réponse) c'est que ce script est lancé une dizaine de fois.. Le nom de chaque fichier est différent mais au final le processus porte le même nom.
On m'a proposé ce script :
<?php
  function PsExecute($command, $timeout = 60, $sleep = 2) {
        // First, execute the process, get the process ID

        $pid = PsExec($command);

        if( $pid === false )
            return false;

        $cur = 0;
        // Second, loop for $timeout seconds checking if process is running
        while( $cur < $timeout ) {
            sleep($sleep);
            $cur += $sleep;
            // If process is no longer running, return true;

           echo "\n ---- $cur ------ \n";

            if( !PsExists($pid) )
                return true; // Process must have exited, success!
        }

        // If process is still running after timeout, kill the process and return false
        PsKill($pid);
        return false;
    }

    function PsExec($commandJob) {

        $command = $commandJob.' > /dev/null 2>&1 & echo $!';
        exec($command ,$op);
        $pid = (int)$op[0];

        if($pid!="") return $pid;

        return false;
    }

    function PsExists($pid) {

        exec("ps ax | grep $pid 2>&1", $output);

        while( list(,$row) = each($output) ) {

                $row_array = explode(" ", $row);
                $check_pid = $row_array[0];

                if($pid == $check_pid) {
                        return true;
                }

        }

        return false;
    }

    function PsKill($pid) {
        exec("kill -9 $pid", $output);
    }
?>
Mais problème je ne le comprend pas.. Car je débute dans linux, et pour le php, je sais gérer les formulaires, les avis/commentaires etc mais pas plus

J'espère avoir été assez clair, et j'espère que vous pourrez m’expliquer, ou m'en proposer un autre !

Mais en tout cas, merci beaucoup par avance !