debuthmx Posted July 12, 2007 Share Posted July 12, 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? Link to comment Share on other sites More sharing options...
Compte_supprime_74291 Posted July 12, 2007 Share Posted July 12, 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 Link to comment Share on other sites More sharing options...
debuthmx Posted July 13, 2007 Author Share Posted July 13, 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. Link to comment Share on other sites More sharing options...
Compte_supprime_74291 Posted July 13, 2007 Share Posted July 13, 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? Link to comment Share on other sites More sharing options...
debuthmx Posted July 13, 2007 Author Share Posted July 13, 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 Link to comment Share on other sites More sharing options...
Compte_supprime_74291 Posted July 13, 2007 Share Posted July 13, 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... Link to comment Share on other sites More sharing options...
debuthmx Posted July 13, 2007 Author Share Posted July 13, 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. Link to comment Share on other sites More sharing options...
Compte_supprime_74291 Posted July 13, 2007 Share Posted July 13, 2007 Ah, bah oui... là, ce serait plus ton a.out que nohup, le problème Link to comment Share on other sites More sharing options...
debuthmx Posted July 13, 2007 Author Share Posted July 13, 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. Link to comment Share on other sites More sharing options...
Compte_supprime_74291 Posted July 13, 2007 Share Posted July 13, 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)...? Link to comment Share on other sites More sharing options...
debuthmx Posted July 13, 2007 Author Share Posted July 13, 2007 oui ça ça marche chez moi aussi. Mais ce n'est pas vraiment un programe compilé sur la machine même. Link to comment Share on other sites More sharing options...
lorinc Posted July 13, 2007 Share Posted July 13, 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 Link to comment Share on other sites More sharing options...
tuXXX Posted July 14, 2007 Share Posted July 14, 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) Link to comment Share on other sites More sharing options...
debuthmx Posted July 14, 2007 Author Share Posted July 14, 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. Link to comment Share on other sites More sharing options...
tuXXX Posted July 14, 2007 Share Posted July 14, 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 Link to comment Share on other sites More sharing options...
debuthmx Posted July 15, 2007 Author Share Posted July 15, 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. Link to comment Share on other sites More sharing options...
tuXXX Posted July 15, 2007 Share Posted July 15, 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. Link to comment Share on other sites More sharing options...
debuthmx Posted July 16, 2007 Author Share Posted July 16, 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. Link to comment Share on other sites More sharing options...
theocrite Posted July 20, 2007 Share Posted July 20, 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. Link to comment Share on other sites More sharing options...
16ar Posted July 20, 2007 Share Posted July 20, 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 :) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.