0

Je vous écris un outil de développement, dont une partie va lancer un ordinateur portable Jupyter en arrière-plan avec la sortie envoyée à un fichier particulier, commeComment afficher les informations de connexion de Jupyter Notebook alors que tout le reste est envoyé à un fichier journal?

jupyter notebook --ip 0.0.0.0 --no-browser --allow-root \ 
    >> ${NOTEBOOK_LOGFILE} 2>&1 & 

Cependant, je veux encore l'information de démarrage de l'ordinateur portable pour être imprimé sur la console via stdout. Tels que

[I 18:25:33.166 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret 
[I 18:25:33.189 NotebookApp] Serving notebooks from local directory: /faces 
[I 18:25:33.189 NotebookApp] 0 active kernels 
[I 18:25:33.189 NotebookApp] The Jupyter Notebook is running at: http://0.0.0.0:8888/?token=b02f25972... 
[I 18:25:33.189 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). 
[C 18:25:33.189 NotebookApp] 

    Copy/paste this URL into your browser when you connect for the first time, 
    to login with a token: 
     http://0.0.0.0:8888/?token=b02f25972... 

afin que les utilisateurs puissent toujours voir quelle chaîne de connexion URL ils ont besoin.

J'ai essayé de cat ce fichier après la commande de cahier mais ceci a quelques inconvénients.

Le temps qu'il faut pour le portable pour lancer et imprimer le message est variable, et en utilisant une combinaison de sleep avec cat le fichier journal est indésirable, parce que s'il y a un retard rare dans le temps de démarrage, cat du Le fichier journal peut ne rien imprimer car le fichier est vide. D'autre part, je ne veux pas mettre l'heure de sommeil à un nombre trop élevé, car les utilisateurs devront attendre trop longtemps au démarrage.

J'ai également essayé tail -f ${NOTEBOOK_LOGFILE} | grep -n 10 (parce que les lignes de démarrage seront les 10 premiers). C'est prometteur, mais le serveur de bloc-notes n'ajoute pas de nouvelle ligne à chaque ligne jusqu'à ce que la ligne suivante soit entrante. Cela signifie que si vous attendez 10 lignes, le processus tail se bloque jusqu'à ce qu'un autre message soit enregistré dans le fichier journal (produisant le 10ème saut de ligne).

Comment puis-je m'assurer que les informations de démarrage s'affichent sur la sortie stdout rapidement, à partir du moment où l'ordinateur portable affiche ces informations, tout en redirigeant la sortie de l'ordinateur portable dans un fichier journal?

Répondre

0

J'ai figuré un hack pour le faire avec tail et head, mais serait intéressé par quelque chose de plus simple.

(tail -f -n +1 ${NOTEBOOK_LOGFILE} | head -n 5); 

Cela repose sur le fait que l'URL de connexion est également imprimé parmi les 5 premières lignes, et donc il ne sera pas question de l'absence de nouvelle ligne qui ne cesse head attendre si vous essayez d'extraire des lignes 9 et 10.