Setsid ne marche qu'un temps

Fermé
Kalyptus - 7 févr. 2009 à 19:16
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 - 9 févr. 2009 à 09:01
Bonsoir,
Je me suis rendu compte que nombre de problèmes que j'avais rencontrés étaient dus à un problème assez ennuyeux : quand je lance un programme avec setsid, que ce soit un bot en C destiné à un tchat, ou un script PHP destiné à servir de serveur socket, il marche un moment mais finit par s'arrêter.
Ce temps est variable, ça va de quelques secondes à plusieurs heures.
Je fais par exemple

setsid php -f socket3.php

, et tant que le Terminal reste ouvert c'est bon, ensuite je le ferme et au bout d'un moment les clients ne peuvent plus se connecter.
Je rouvre une session, fais un ps aux et vois que le processus n'est bel et bien plus là.

Comment remédier à ce problème ?
Je précise qu'Ubuntu est sur mon serveur, je ne lance pas ces choses depuis chez moi, et c'est pour ça que je suis obligé d'utiliser setsid pour que les choses restent lancées.

Merci d'avance

9 réponses

mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
8 févr. 2009 à 04:12
C'est tout à fait normal, car ton processus est rattaché à un shell que tu tues en quittant ton terminal. Il faut donc l'e n détacher.

Pour cela tu disposes de deux outils :
- nohup : il suffit à faire ce que tu souhaites
- screen : il permet d'encapsuler un shell que tu peux réutiliser plus tard : http://doc.ubuntu-fr.org/screen

Je te conseille nohup ça te suffira amplement et c'est plus simple à utiliser :
nohup ma_commande

Bonne chance
0
Un ami m'a en effet parlé de screen par la suite, j'essaierai les deux.

Mais alors, pourquoi est-ce que ça marche tout de même pendant un moment ?

Merci de ta réponse
0
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
8 févr. 2009 à 04:17
Aucune idée, a priori le processus meurt tout de suite. Je pense que c'est simplement les clients qui mettent un peu de temps à s'en apercevoir.

De toutes façons c'est facile à vérifier. Tu te connectes via deux terminaux :
- le premier sert à faire ta manipulation habituelle,
- le deuxième sert uniquement à faire des "ps faux" et des "netstat -a".

Et tu seras fixé ;)

Bonne chance
0
Bah je confirme que ça ne se ferme pas tout de suite, puisque ça marche parfois pendant plusieurs minutes encore, ps aux à l'appui... Et mes clients ne laggent pas (huhu), vu que quand je kill manuellement le serveur, ils affichent INSTANTANEMENT que la liaison a été coupée...

Mystérieux...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
8 févr. 2009 à 15:42
Oui comme tu dis ^^ Peut-être que quand tu lances ton serveur le script charge un processus détaché de ton shell (une sorte de loader). Alors que quand tu tues ton serveur, tu tues explicitement le serveur. C'est l'intérêt du "ps faux" on voit rapidement les dépendances entre les processus. Enfin ça me paraît assez vaseux comme explication :-)

Bon mais à la limite peu importe, tu as testé avec nohup ?

Bonne chance
0
nohup a le même effet, ça marche un moment et puis plus :\
0
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
9 févr. 2009 à 01:07
C'est de plus en plus bizarre mais à la limite ça a le mérite d'être logique. Pour une raison assez étrange ton serveur doit se dire "et si je me fermais" lorsqu'il ne te vois plus connecté. Du coup ça expliquerait pourquoi le comportement est le même avec nohup et quand tu te déconnectes. La question maintenant c'est pourquoi (et comment y remédier !).

C'est quoi au fait comme genre de serveur ?

Je craque cpeut-être complètement, mais que se passe-t'il si tu te loggues sur cette machine et qu'à partir de ce shell, tu lances le serveur au travers d'un ssh vers localhost. Exemple (en remplaçant login par ton login sur cette machine, et serveur par le hostname du serveur ou son adresse IP) :
ssh login@serveur
nohup ssh root@localhost la_commande_pour_lancer_le_serveur

(ctrl z)
bg

(ctrl d)

Bonne chance
0
Je ne peux pas essayer ton truc car c'est un peu le bordel au niveau des sessions, m'enfin j'ai essayé screen et il me semble que ça fonctionne à long terme.

Mon serveur est un Ubuntu Server 8.04.1, un RPS1 de chez OVH. J'y ai un accès root donc, c'est comme un dédié.

Merci encore de ton aide, à moins que screen me lâche lui aussi ça devrait être bon. Je lance ce soir, et je verrai demain matin s'il a tenu pendant la nuit, alors je partirai de l'idée que je n'ai plus à m'en préoccuper.

A+
0
mamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 7 808
9 févr. 2009 à 09:01
Ok :-)
0