我正在编写一个开发人员工具,其中一部分将在后台启动一个Jupyter笔记本,并将输出发送到特定文件,例如
jupyter notebook --ip 0.0.0.0 --no-browser --allow-root \
>> ${NOTEBOOK_LOGFILE} 2>&1 &
但是,我仍然希望通过stdout将笔记本的启动信息打印到控制台。如
[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...
这样用户仍然可以看到他们需要的URL连接字符串。
我在笔记本命令之后尝试cat
这个文件,但这有一些缺点。
笔记本启动和打印消息所需的时间是可变的,并且使用sleep
和cat
的组合,日志文件是不可取的,因为如果开始时有一个罕见的延迟-up time,日志文件的cat
可能没有打印,因为文件是空的。
另一方面,我不想将睡眠时间设置为过高的数字,因为用户将不得不在启动时等待太长时间。
我也试过tail -f ${NOTEBOOK_LOGFILE} | grep -n 10
(因为启动线将是前10行)。这是有希望的,但笔记本服务器不会在每一行附加换行符,直到下一行传入。这意味着如果等待10行,tail
进程将挂起,直到其他消息记录到日志文件中(生成第10个换行符)。
如何在笔记本输出此信息的同时,及时将笔记本输出重定向到日志文件中,以确保及时向stdout显示启动信息?
答案 0 :(得分:0)
我想用tail
和head
来做这件事,但会对更简单的事情感兴趣。
(tail -f -n +1 ${NOTEBOOK_LOGFILE} | head -n 5);
这依赖于连接URL也在前5行中打印的事实,因此如果您试图从中提取head
,那么保持greedy = /.*b/
posssessive = /.*+b/
等待的新行的缺失将无关紧要第9和第10行。