Posté(e) le 12 juillet 200718 a 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?
Posté(e) le 12 juillet 200718 a 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
Posté(e) le 13 juillet 200718 a Auteur 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.
Posté(e) le 13 juillet 200718 a 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?
Posté(e) le 13 juillet 200718 a Auteur 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
Posté(e) le 13 juillet 200718 a 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...
Posté(e) le 13 juillet 200718 a Auteur 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.
Posté(e) le 13 juillet 200718 a Auteur 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.
Posté(e) le 13 juillet 200718 a 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)...?
Posté(e) le 13 juillet 200718 a Auteur oui ça ça marche chez moi aussi. Mais ce n'est pas vraiment un programe compilé sur la machine même.
Posté(e) le 13 juillet 200718 a et pourquoi tu tiens absolument à utiliser nohup ? au début, c'est ce que je faisais, mais en fait, screen est largement plus sympa
Posté(e) le 14 juillet 200718 a 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)
Posté(e) le 14 juillet 200718 a Auteur 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.
Posté(e) le 14 juillet 200718 a 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
Posté(e) le 15 juillet 200718 a Auteur 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. Modifié le 15 juillet 200718 a par debuthmx
Posté(e) le 15 juillet 200718 a 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.
Posté(e) le 16 juillet 200718 a Auteur 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.
Posté(e) le 20 juillet 200718 a 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.
Posté(e) le 20 juillet 200718 a 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 :)
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.