Nil Le 02/12/2010 à 16:15 Bon, j'ai un problème qui me bloque depuis plusieurs jours...
Dans un autre sujet, j'ai parlé de la commande winexe qui me permet de lancer une commande sur une machine Windows depuis Linux. Cette commande fonctionne parfaitement bien et remplit idéalement son rôle. Sauf que...
Ca déconne lorsqu'elle est lancée depuis un script php depuis Apache, et ce sous deux configurations différentes (un Ubuntu 9.10 avec PHP 5.2/Apache /2.2.12 et un Arch linux avec PHP 5.3.3 et Apache 2.2.17).
Concrètement, la commande se lance et fait ce qu'on lui demande, mais ne se finit jamais. Un top m'indique qu'elle est toujours "Running" et qu'elle utilise un processeur à 100% (avec Ubuntu, avec l'utilisateur www-data ; avec Arch avec http).
Ce qui est terrible, c'est que si je lance la commande exec("/usr/bin/winexe -d 1 --user=servadm/nil --password=suPeRPass --interactive=0 --uninstall //MonServWin \"c:\test.bat\" "); depuis php -a ça fonctionne parfaitement... même si je lance php -a avec l'utilisateur apache.
Les autres commandes lancées depuis exec() dans un script web fonctionnent très bien (un ls |grep o fait ce qu'on lui demande de faire).
Est-ce que vous savez s'il y a des paramètres qui pourraient faire merder l'exécution à travers Apache ?
rocess qui est dans les choux, j'ai comme message d'erreurtevent: EPOLL_CTL_ADD failed (Operation not permitted) - falling back to select()Ah, un dernier détail, mais je ne sais pas si c'est intéressant... si je tue le pmais je ne sais pas si c'est le fait de l'avoir tué qui provoque ça, ou si c'est la cause de la mise en vrac...
Petite info en passant : si j'exécute exec("/usr/bin/winexe"); sans rien, le script se finit proprement avec comme retour l'aide minimale ; idem si je demande la version avec -V. C'est dès que je fais une opération RPC que ça merde...
Souane, s'il te plaît, aide-moi !

Nil Le 02/12/2010 à 16:19 Ca lance php en mode interactif (si tu as installé les paquets php-cli)... concrètement, tu as une console qui te permet de lancer des commandes php directement.
as tu la possibilité de préfixer la commande avec un strace pour voir quel est l'appel système qui s'est fait refuser l'accès?
Zeph Le 02/12/2010 à 16:41 Tu as essayé de rediriger toutes les entrées/sorties standard, pour vérifier qu'une communication non terminée ne bloque le processus ? (j'ai vu ça une fois, par contre a priroi ça n'expliquerait pas l'utilisation à 100% du CPU...)

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
epoll pourrait être lié à des connexions réseaux (il a dit que ça bloque quand il fait du RPC)
man 2 select:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
[...]
select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation
(e.g., input possible). A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (e.g., read(2)) without blocking.
On remarque que select est appelé avec les valeur :
select(9, [0 5 8], [], NULL, {0, 8386}) = 2 (in [0 5], left {0, 8384})
Donc il attend sur 0, 5 et 8 (readfds)
que sont 0, 5 et 8 ?
0 est stdout
5 est le dernier open retournant 5, cad socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 5
donc c'est une socket reseau
8 est socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 8
donc une socket aussi.
Tu as donc un probleme reseau dans cet environement.

Proud to be CAKE©®™
GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
vu que c'est précédé par sendto(), il envoie une bouteille à la mer et ne reçoit rien.
ben c'est ce qu'ils disent: il essaye de lire stdin (=0, stdout=1, stderr=2) alors qu'il y a rien a lire.
du coup ça marche bien en interactif (php -a) mais pas en automatique.
Ce qui est strange c'est que ça bouffe 100% de cpu.
a priori ton workaround c'est juste de remplacer winexe par:
screen -S $name-of-this-screen-session -D -m winexe (all the winexe
options you need here)
RHJPP Le 03/12/2010 à 00:01 Bah oui, pourquoi ne pas te faire juste un petit script intermédiaire qui ne ferait que fournir les flux manquants à ton programme ?
Nil Le 03/12/2010 à 06:53 J'ai pas essayé avec screen ; par contre, j'avais essayé avec un
echo Mon mot de passe\n|sudo -u mon utilisateur winexe ...
pensant naïvement que sudo ouvrirait un vt virtuel.