Jump to content

nohup.out ne se réactualise pas.


Recommended Posts

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

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 :fou:

Link to comment
Share on other sites

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

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 :D ... bon, j'ai craqué, à chercher midi à quatorze heures :craint:

... 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

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

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

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

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

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

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

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

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

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

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

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...