debuthmx Posté(e) le 12 juillet 2007 Partager Posté(e) le 12 juillet 2007 Je lance un code sur ma machine distante depuis chez moi à l'aide de la commande nohup. Cepandant, lorsque je fais un nohup ./a.out & , il créé un fichier nohup.out mais lorsque je l'ouvre, le fichier est vide alors que le programme habituellement m'affiche des colones de nombres à l'écran. En fait j'ai remarqué que le fichier est écrit lorsque le programme se termine. En conclusion, le fichier nohup.out n'est pas mise à jour au fur et à mesure. Le problème c'est que mon programme tourne pendant plusieurs heures (plus de 24), donc, je n'ai aucun moyen de visualiser l'état de l'éxecution. Comment puis-je faire pour une mise à jour régulière du fichier nouhup.out? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 12 juillet 2007 Partager Posté(e) le 12 juillet 2007 En googlant vite fait, je vois pas mal de référence à la syntaxe "nohup ./a.out", mais, je ne m'en suis jamais servi comme ça... ... je fais plutôt un truc du genre "nohup le_programme" ou éventuellement "nohup le_programme > fichier_de_redirection_de_sortie"... et normalement, ça marche en direct, au fur et à mesure que le out de la commande lancée renvoie des choses... Mais, je plussoie ce qui a été dit dans l'autre thread... screen, çaylebien Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 13 juillet 2007 Auteur Partager Posté(e) le 13 juillet 2007 En googlant vite fait, je vois pas mal de référence à la syntaxe "nohup ./a.out", mais, je ne m'en suis jamais servi comme ça... Dans "./a.out", le ./ signifie exécuter et le fichier a.out est l'executable creer par défaut lors de la compilation de ton programme si aucun nom d'executable n'est spécifié. Si aucun fichier de redirection n'est spécifier avec nohup, la redirection se fait automatiquement dans le fichier créé par défaut à savoir le fichier nohup.out. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 13 juillet 2007 Partager Posté(e) le 13 juillet 2007 Oki... en fait, sémantiquement, le ./, c'est juste pour donner l'alias du chemin entier de l'exécutable, parce qu'il n'est pas dans le $PATH, plutôt que pour exécuter en soit ... bon, j'ai craqué, à chercher midi à quatorze heures ... par contre, du coup, c'est bizarre... et, en rajoutant un "&" au bout de "nohup ./a.out", pour passer la main dès que le programme est démarré, ça ne marche pas mieux? Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 13 juillet 2007 Auteur Partager Posté(e) le 13 juillet 2007 lorsque je regarde le fichier nohup.out, voici ce que je vois comme permission. Y a t'il quelque chose qui cloche? -rw------- 1 moi users 0 Jul 13 12:24 nohup.out Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 13 juillet 2007 Partager Posté(e) le 13 juillet 2007 Bah, non, c'est normal (si c'est l'utilisateur "moi" qui lance le nohup)... de toute façon, tu dis que le nohup.out se remplit bien, mais quand le programme se termine: c'est ça qui est bizarre... Normalement, tout ce qui vient de la sortie écran et de la sortie erreur (stdout et stderr) de ton shell est redirigé vers le nohup.out, au fur et à mesure... Donc, si ton programme, lorsqu'il est lancé normalement, affiche bien des choses sur le stdout de ton term, c'est bizarre que ça n'aille pas dans le nohup.out... là, je ne vois pas... Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 13 juillet 2007 Auteur Partager Posté(e) le 13 juillet 2007 Je crois que j'ai compris. Je viens de faire le test suivant ./a.out > trace.txt & et j'ai remarqué que le fichier trace.txt est créé mais n'est pas mise à jour. En fait j'ai l'impression que toutes mes redirections sont bufferiser et écrite uniquement à la fin de l'éxecutable. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 13 juillet 2007 Partager Posté(e) le 13 juillet 2007 Ah, bah oui... là, ce serait plus ton a.out que nohup, le problème Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 13 juillet 2007 Auteur Partager Posté(e) le 13 juillet 2007 je viens de faire celà avec un programme hyper simple qui m'affiche 3 nombres et j'ai exactement le même problème. Pourquoi le a.out? Lorsque je ne fait pas de redirection tout est bien afficher à l'écran en temps réel. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 13 juillet 2007 Partager Posté(e) le 13 juillet 2007 C'est bizarre, parce que si je fais un script tout con, du genre, dans le fichier ./test while ((1==1) do echo pouet done et que je lancer un "nohup ./test" Il me remplit bien le fichier ./nohup.out de "pouet" au fur et à mesure de l'exécution... Il est écrit en quoi, ton a.out? Tu es sûr que tu envoies les résultats vers stdout (m'enfin, s'il te l'affiche à l'écran en live en le lançant normalement, il y a des chances)...? Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 13 juillet 2007 Auteur Partager Posté(e) le 13 juillet 2007 oui ça ça marche chez moi aussi. Mais ce n'est pas vraiment un programe compilé sur la machine même. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 13 juillet 2007 Partager Posté(e) le 13 juillet 2007 et pourquoi tu tiens absolument à utiliser nohup ? au début, c'est ce que je faisais, mais en fait, screen est largement plus sympa Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 14 juillet 2007 Partager Posté(e) le 14 juillet 2007 C'est sûrement parce qu'il faut faire des fflush pour être sûr de voir les résultats... et echo le fait automatiquement, du coup ça marche, mais la même chose en C sans fflush ça fait le comportement décrit plus haut (rien dans le fichier) : #include <stdio.h> int main() { int i; for(i=0;i<1000;i++) { printf("%i\n", i); fflush(stdout); sleep(1); } return 0; } (juste à essayer avec et sans le fflush) (ah oui une remarque : en C++, endl fait un "\n" et fflush en même temps) Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 14 juillet 2007 Auteur Partager Posté(e) le 14 juillet 2007 et pourquoi tu tiens absolument à utiliser nohup ? au début, c'est ce que je faisais, mais en fait, screen est largement plus sympa Parceque le code tourne sur ma machine distante et je le lance par ssh. Les calcules durent plusieurs jours et à l'écran, il m'affiche régulièrement l'évolution des calcules. J'utilise donc un nohup pour pouvoir me déconecter et j'espérais visualiser l'état d'avencement de mes calcules en visualisant le fichier nohup.out. Mais si je peux le faire avec un screen alors je suis partant. Dis-moi juste comment je dois m'y prendre. ah oui une remarque : en C++, endl fait un "\n" et fflush en même temps Mon programe est écrit en fortran, c'est quoi l'équivalent. Je crois que mon problème viens de ma version de fedora. Le nohup fonctionne très bien lorsque je le lance sur une autre machine. Vraiment bisard. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 14 juillet 2007 Partager Posté(e) le 14 juillet 2007 ah oui une remarque : en C++, endl fait un "\n" et fflush en même temps Mon programe est écrit en fortran, c'est quoi l'équivalent. Je n'ai jamais fait de fortran, mais ils en parlent là : http://www.stat.osu.edu/current/support/pr...g/f77flush.html Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 15 juillet 2007 Auteur Partager Posté(e) le 15 juillet 2007 ok j'ai résolu mon problème. Comme on le soupçonnait, il bufferisait toutes mes redirections et écrivait le fichier nohup.out à la fin de l'execution du programme. Le flush était donc la solution. J'ai juste ajouté (pour le fortran) " CALL FLUSH(6)" à l'intérieur de ma boucle et mon fichier nohup.out est actualisé à chaque ittération. J'avais exactement le même problème lorque j'écrivais dans un fichier, je m'en sortais en ouvrant et fermant le fichier à chaque fois... ce qui accroit considérablement le temps de calcul. Pensez-vous qu'en laissant le fichier ouvert et en y ajoutant un flush celà améliorerait les performances? En tout cas merci à tous. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 15 juillet 2007 Partager Posté(e) le 15 juillet 2007 Le flush était donc la solution. J'ai juste ajouté (pour le fortran) " CALL FLUSH(6)" à l'intérieur de ma boucle et mon fichier nohup.out est actualisé à chaque ittération. J'avais exactement le même problème lorque j'écrivais dans un fichier, je m'en sortais en ouvrant et fermant le fichier à chaque fois... ce qui accroit considérablement le temps de calcul. Pensez-vous qu'en laissant le fichier ouvert et en y ajoutant un flush celà améliorerait les performances? Sans doute. Tu peux même faire le flush seulement une fois toutes les N itérations (10, 100, ça dépend de la vitesse du calcul), comme ça ça ne ralentit pas trop le calcul et ça permet quand même de savoir où ça en est. Lien vers le commentaire Partager sur d’autres sites More sharing options...
debuthmx Posté(e) le 16 juillet 2007 Auteur Partager Posté(e) le 16 juillet 2007 ok, j'ai essayer d'utiliser screen. Ca a l'aire simpas je sais qu'il faut faire C-a d pour détacher une scession mais comment faire pour supprimer définitivement le lien. Je veux dire si je fait screen -r, il réatache automatiquement mais moi j'ai tapper tellement de fois la commande screen que je ne sais plus qu'st ce qui est rattacher à quoi, deplus certains fichiers sont ouvert deux fois. J'ai envie de tout purger. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 20 juillet 2007 Partager Posté(e) le 20 juillet 2007 screen -r t'affiche la liste des instances disponibles. Pour fermer un session tu fermes le shell, tout simplement. Sinon pour voir les sessions ouvertes, tu peux faire C-a w. Lien vers le commentaire Partager sur d’autres sites More sharing options...
16ar Posté(e) le 20 juillet 2007 Partager Posté(e) le 20 juillet 2007 ok, j'ai essayer d'utiliser screen. Ca a l'aire simpas je sais qu'il faut faire C-a d pour détacher une scession mais comment faire pour supprimer définitivement le lien. Je veux dire si je fait screen -r, il réatache automatiquement mais moi j'ai tapper tellement de fois la commande screen que je ne sais plus qu'st ce qui est rattacher à quoi, deplus certains fichiers sont ouvert deux fois. J'ai envie de tout purger. Il suffit de rattacher ton screen, puis de stopper l'execution du programme (CTRL + C), puis de faire un bete exit :) Normalement, ca mettra dans ta sortie : [screen exited] ou un truc du genre :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.