- 在使用
ssh
连接远程服务器时,我们能够以远程管理服务器的方式,在远程终端执行后台命令。但是,如果在命令没有执行完毕就退出登录,这个命令的执行就会中断。 - 有些时候,我们想要退出登录,但保持程序的运行。比如使用远程服务器训练深度学习模型时,我们不想一直保持与服务器的连接
- 我们使用
nohup
命令就可以解决这一问题
[root@localhost ~]# nohup [命令] &
nohup
是 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略SIGHUP
信号,保证程序能够正常进行。SIGHUP
信号是在终端被终止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。所以如果你不希望进程被这个信号干掉的话,就可以忽略这个信号。而nohup
命令做的就是这个事情,让进程不受 shell 关闭的影响。- 同时,
nohup
执行后,会产生文件nohup.out
,将程序执行产生的stdout/stderr
重定向到这个文件中。一般在当前目录下,如果当前目录不可写,那么自动保存到执行这个命令的用户的home
目录下,例如root
的话就保存在/root/
下。
- 同时,
&
是将命令放到后台运行。将程序放在后台意味着,我们不再与其进行交互。这个命令会使程序忽略SIGINT
信号,我们用ctrl C
,也不会影响到程序的运行。&
也不会重定向stdout/stderr
,因此如果程序有任何的输出或产生错误,将直接在终端显示。
- [命令]就是我们正常执行程序所输入的命令,比如:
python train.py
nohup python train.py &
- 执行
train.py
程序,放到后台执行,并忽略shell
关闭给的SIGUP
指令 python train.py
就是[命令]
>
是输出符号,代表重定向到哪里1
是stdout
标准输出,系统默认值是1。所以> hello.txt
等同于1 > hello.txt
2
是stderr
标准错误&
是等同于的意思,2>&1
,表示,stderr
的输出重定向到和stdout
同样的位置
print('hello world')
p # 故意写错
2.3.3.执行命令
-
python test.py > hello.txt 2>&1
-
hello.txt
中的内容- 可以看到,输出和错误都重定位到了
hello.txt
中
hello world Traceback (most recent call last): File "/home/nsy/detection/yolov5-master/nsy_demo.py", line 2, in
p NameError: name 'p' is not defined - 可以看到,输出和错误都重定位到了
-
-
python test.py > hello.txt
-
hello.txt
中的内容- 可以看到,只有输出重定位到了
hello.txt
中
hello world
- 错误信息在终端输出(默认),而没有被重定位
- 可以看到,只有输出重定位到了
-
-
我们可以将重定位命令和挂起命令一起使用
nohup python test.py > hello.txt 2>&1 &
nohu
p 命令结合 &
符号可以使进程在后台运行,即使关闭了终端依然不受影响。这时,如果想要终止这个进程,要怎么 *** 作呢?
-
最简单的就是使用
kill
命令kill 进程号
-
如何找到进程对应的
pid
呢?-> 使用ps
命令ps aux | grep 程序名
。比如ps aux | grep train.py
- 找到进程号之后,使用
kill PID
就行了
- 找到进程号之后,使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)