Soucis occupation proc par appel exec()

Petit nouveau ! | 5 Messages

28 déc. 2008, 06:10

Bonjour,
Voilà j'ai un problème sur un serveur dédié assez léger qui doit faire de l'encodage vidéo...
Actuellement je le fait de cette manière:

Code : Tout sélectionner

exec("ffmpeg ... 2>1&",$a,$b);
Mon problème ? Site innacessible durant le temps de la conversion (et depuis que je suis sur le serveur de prod: un technicien passe quasiment toute les nuits où je bosse pour faire un hard reset sur ma machine puisque elle ne ping plus pendant un moment... :shock: merci OVH ;))

J'ai cherché dans le marginal avec du php threadé, asynchrone, etc. mais ce que je souhaiterais faire c'est tout simplement limiter la priorité du process lancé par exec afin de laisser un peu d'air au serveur...

Mais comment ? Récuperer l'id du processus dans l'exec(ffmpeg..) pour utiliser un autre exec qui limiterera la priorité du premier ?!

Bon voila si quelqu'un à une solution il sauvera la vie d'un technicien qui cours de grand risque à prendre un malin plaisir à chaque hard reset de mon serveur... alors Merci beaucoups !

ViPHP
ViPHP | 2287 Messages

28 déc. 2008, 12:04

Pour lancer un programme en spécifiant sa priorité, renseigne-toi sur la commande nice.

Code : Tout sélectionner

$ man nice
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

28 déc. 2008, 13:01

Merci !

Alors je viens de lire le man et d'essayer ça:

exec("nice -n 19 ffmpeg ...");

Mais bon ça ne fonctionne pas ...
Dommage ta solution été parfaite pour moi :(

Je suis toujours dans la ... et après ce test mon serveur va re-subir un hard reset... Alors vraiment merci pour toute aide !

ViPHP
ViPHP | 4674 Messages

28 déc. 2008, 13:01

Hey :),

Au passage, je ne crois pas que la redirection de flux 2>1& fonctionnera … Soit tu veux dire 2&>1 soit 2>&1, mais ta solution ne fonctionnera pas comme tu le désires. Pour mieux comprendre :

Code : Tout sélectionner

$ man bash /REDIRECTION n
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 5 Messages

28 déc. 2008, 13:10

En fait j'utilise 2&>1, désolé je n'ai pas lu ma source avant de poster une question (pas bien).

Au passage est-ce que cette "redirection de flux" (content de savoir comment ça s'appelle :)) peut être à l'origine de mon nice qui n'a aucun effet ?

En tout cas merci du coup de main.

ViPHP
ViPHP | 4674 Messages

28 déc. 2008, 13:26

Bah le mieux pour tout observer est de ne faire aucune redirection de flux. Tu peux utiliser passthru() aussi, qui se manipule un peu mieux. J'utilise toujours ceci :
ob_start();
passthru($command . '2>&1', $return);
$content = ob_get_contents();
ob_end_clean();
On obtient ainsi le code de retour de la commande dans $return (très utile), et on lit la sortie d'erreur à la sortie standard (STDERR à STDOUT) dans $content.

Tu peux ensuite faire des tests du genre :
if($return > 0)
    throw new My_Exception('Error when executing the command %s (returned the code %d).', $command, $return);
 par exemple (j'ai placé les arguments comme dans un printf(), ce n'est pas le fonctionnement réel).
Je rappelle que 0 en Shell est la valeur vraie ou plutôt succès. Tout retour différent de 0 (i.e. 1, 2 …) est considéré comme une erreur.

Attention à ne pas négliger les fonctions escapeshellarg() et escapeshellcmd().
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 5 Messages

29 déc. 2008, 12:03

OK pour passthru je regarderai ça mais via exec ca fonctionne bien pour le moment et je récupère toutes les infos dont j'ai besoin...

Mon seul pb à l'heure actuelle est l'occupation proc d'environ 99,9 % et "nice -n 19" ne change absolument rien...

Je ne pense pas que d'utiliser passthru ou exec y change quelque chose... (mais je peut me tromper ça c'est déja vérifié de nombreuses fois...)

Par contre si quelqu'un sait pourquoi nice n'a pas d'effet ou connait une autre technique pour limiter la priorité de l'appli lancé par exec (ou passthru ?) ca serait tout simplement... formidable.

ViPHP
ViPHP | 4674 Messages

30 déc. 2008, 16:46

En général, les serveurs Web ne sont pas des bêtes de calculs. La preuve, on trouve souvent des pentium dessus. Tout bonnement parce que ça ne sert à rien. Il faut plutôt de la mémoire et des disque rapides.

Est-ce que tu ne peux pas exporter tes traitements sur un autre serveur et transférer le résultat une fois le calcul terminé ? Tu as essayé de demander sur le forum d'OVH aussi (ce qui àmha est la meilleure solution) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 5 Messages

31 déc. 2008, 16:12

C'est vrai c'est pas le must ce serveur pour l'encodage mais pas encore la possibilité financière d'avoir plus gros ni d'exporter ce traitement (j'espère pouvoir faire ça rapidement...)

Sinon j'ai posté ici parce que j'avais l'espoir que php permette de lancer un executable par une fonction qui lui est propre tout en limitant fortement sa priorité (à la manière de la création de thread en C / C# et quitte à ce que le traitement dure des heures) car je suis un peu shellophobe

Donc en effet un forum sur linux ou ubuntu semble plus approprié, merci quand même ;)

ViPHP
ViPHP | 4674 Messages

31 déc. 2008, 17:21

PHP ne peut pas faire ce que tu demandes car ce n'est pas son rôle. En revanche, tu peux lancer des commandes systèmes comme on le proposait ici. C'est donc un problème à résoudre avec les commandes systèmes. Tu sais comment lancer ça depuis PHP maintenant, c'est déjà un soucis de moins ;-).

Reviens nous donner la réponse si tu la trouves, merci :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).