最近发现有时候跑程序,跑到一半网断了,然后就与服务器链接断了。这时候程序就跑到一半停止运行了。这可怎么办呢?网上查了资料,说是nohup和tmux可以帮助解决这个问题。
网上说nohup和tmux都可以在用户断开链接、重新链接期间保持程序运行。我先测试了nohup,写了一个循环代码,每过1s输出一个数字。
首先测试:nohup python
写了一个测试代码,每秒输出一个数字
import sys
from time import sleep
def main():
print("Starting....")
i=0;
while True:
print(i)
i=i+1
sleep(1.00)
if __name__ == "__main__":
main()
nohup python test.py
control c , 发现nohup.out能正常输出结果
然后断开会话,重连。
重连之后就找不到在哪里control c了。。。
htop找到相应进程然后kill,
发现nohup.out里没有输出结果。
但是,如果htop然后给进程发送sigint信号(相当于control c),就可以在nohup.out正常输出结果,相当于control C中断进程的话是可以正常写结果的,当程序正常运行结束应该也可以输出结果(但是我没有测试,我只测试了一个正常结束的进程)。
除了htop可以看进程,以下代码也能看,XXXX就是可以是test,就会输出test相关进程的PID
ps -ef | grep XXXX
因此,nohup是可以让进程 在用户断开链接再重新连接的期间保持程序运行的。 只是kill的话会阻止其写入结果。
那么,有没有办法让程序实时输出呢?
nohup python -u FileName > nohup.out 2>&1 &
参考: nohup 命令 print 不能实时输出至 nohup.out_weixin_30633405的博客-CSDN博客
这样的话cat nohup.out就可以看到实时输出了。
那tmux能否让进程在用户断开链接再重新连接的期间保持程序运行?
可以!
我在tmux的session里做了这样一个测试:
python test.py
然后就输出1,2,3,4。。。。。。。
之后我退出vscode重新进入到tmux的之前那个session
发现输出了31,32,32。。。。
中间空的时间就是退出打开之间的时间,因此,tmux也有这个功能!
如果想开始运行程序就不干了回去闭上眼睛睡大觉,第二天看结果怎么办?
tmux窗口里nohup运行程序,醒来之后直接在nohup.out里找结果,这样前天晚上工作的context也能看到。 不放心的话就用上面实时输出的代码,即使程序没运行完也能看到结果。