Linux后台跑程序的方法总结
当使用ssh进行远程代码运行时,控制端电脑通常不能出现任何意外。然而,运行深度学习程序通常需要数小时或数天的时间,这意味着我们的IDE不能关闭。一旦出现非人为因素(如断电、断网或IDE卡死关闭),远程程序也会中断。因此,将程序灵活地运行在服务器上,不受控制端因素的影响至关重要。
使用 &
将命令放到后台运行
第一种方法是在命令行最后加&符号 command &
# 执行文件 python ./test.py & # 查看是否在后台运行 ps -ef|grep test # 后台的程序 需要关闭时,需要kill命令停止 killall [程序名]
注意:这种方法,查看运行日志很不方便(不推荐)
nohup 命令
nohup
命令允许程序在退出终端后继续运行。输出会默认写到 nohup.out
文件中,或者你可以指定一个输出文件:
nohup python -u test.py > test.log 2>&1 &
参数说明:
python test.py python 运行test.py文件
-u :表程序不启用缓存,也就是把输出直接放到log中,没这个参数的话,log文件的生成会有延迟
> :test.log 将输出日志保存到这个log中
2>1 :2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
2>&1 :&与1结合就代表标准输出了& :代表该命令在后台执行
查看nohup的后台进程:
jobs
disown 命令
如果你已经启动了一个前台任务,可以将其移到后台并使其在你退出终端后继续运行
command # 按下 Ctrl+Z 暂停任务,这会将任务置于后台并暂停状态 bg disown -h
举个例子
1. 启动一个前台任务 python myscript.py
2. 暂停任务并放到后台,按下 Ctrl+Z 暂停任务,这会将任务置于后台并暂停状态。你会看到类似如下的输出:
[1]+ Stopped python myscript.py
然后,使用 bg 命令将任务在后台继续运行:
这会继续执行任务,并且不会占用前台终端。你会看到类似如下的输出:
[1]+ python myscript.py &
3. 使用 disown 移除作业
现在,使用 disown 命令将该作业从 shell 的作业列表中移除:
disown -h %1
这里的 %1 是作业号,如果你有多个作业,可以通过 jobs 命令查看作业列表,并确定正确的作业号。
disown 的选项
- disown 默认情况下会从作业列表中移除指定的作业。
- -h 选项会将作业标记为不发送 HUP 信号(挂起信号),即使终端关闭,作业也会继续运行。
检查后台任务
ps aux | grep myscript.py
screen或者tmux
screen 和 tmux 是两个强大的终端复用器,允许你在会话中运行多个程序,并且可以在会话断开后重新连接。
创建一个新的窗口:执行完命令后会新建一个空白窗口。需要运行的程序在该窗口运行即可
screen -S test
screen 为新建窗口指令,-S test 设置窗口名称
Ctrl+a c :创建窗口 Ctrl+a w :窗口列表
Ctrl+a A :重命名窗口
Ctrl+a d : 分离当前 screen 会话(让它在后台继续运行)
screen -r : 重新连接已经分离的 screen 会话
screen -r id或窗口名称: 重新连接已经分离的 screen 会话
screen -ls : 查看当前所有的screen进程
Ctrl+a n :下一个窗口 Ctrl+a p :上一个窗口 Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换 Ctrl+a K(大写) :关闭当前窗口,并且切换到下一个窗口 (当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态) exit :关闭当前窗口,并且切换到下一个窗口 (当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态) Ctrl+a d :退出当前终端,返回加载screen前的shell命令状态
使用 tmux:
tmux
command
# 按 Ctrl+B 然后按 D 分离会话
要重新连接会话:
tmux attach