本文是《Linux 入门指南》的第十篇文章,以 Ubuntu 21.10 为例,介绍了 Linux 后台命令。

nohup(在后台不挂断地运行命令)

描述:

"no hang up(不挂断)" 的缩写,在后台不挂断地运行命令。

在关闭终端/退出账户后,nohup 在后台继续运行。

默认情况下,nohup 的输出会保存到当前目录下的 nohup.out 文件中。

用法:

      nohup [命令] 

选项:

长选项 意义
--help 显示此帮助信息并退出
--version 显示版本信息并退出

实例:

后台运行命令(在后台不挂断地运行 wget https://speed.hetzner.de/100MB.bin

nohup wget https://speed.hetzner.de/100MB.bin

如果你想停止运行命令,你需要查找对应的 PID,手动杀死对应的进程。

# 查找对应的 PID
jianrry@jianrry:~$ ps -aux | grep wget

jianrry     2882  0.6  0.1  24220  6700 ?        S    23:23   0:00 wget https://speed.hetzner.de/100MB.bin

jianrry     2940  0.0  0.0  17808  2488 pts/0    S+   23:23   0:00 grep --color=auto wget

# 手动杀死对应的进程
jianrry@jianrry:~$ kill -9 2882

screen(会话管理)

描述:

screen 可以创建会话,在会话窗口中运行命令。

挂起会话后,会话窗口中的命令在后台继续运行。

在关闭终端/退出账户后,会话窗口中的命令不受影响。

用法:

      screen [选项] [会话名]

选项:

选项 意义
-4 仅将主机名解析为 IPv4 地址
-6 仅将主机名解析为 IPv6 地址
-a 强制所有功能进入每个窗口的终端
-A 将所有的视窗都调整为目前终端机的大小
-c file 读取配置文件而不是 .screenrc
-d (-r) 挂起正在运行的会话(并在此处恢复)
-dmS name 启动作为守护程序:挂起会话
-D (-r) 挂起和注销远程(并在此处恢复)
-D -RR 做任何需要的事情来获得一个会话
-e xy 更改命令字符
-f 流量控制开启 -fn = off ;-fa = auto
-h lines 设置回滚历史记录缓冲区的大小
-i 当流量控制打开时,会更快地中断输出
-l 登录模式开启 (update /var/run/utmp), -ln = off
-ls [match] or -list 列出所有的会话
-L 打开输出日志记录
-Logfile file 设置日志文件名
-m 忽略已经运行的会话,强制创建一个新的会话
-O 选择最佳输出而不是 exact vt100 emulation
-p window 如果已命名的窗口存在,则预选该窗口
-q 安静的启动。 如果不成功,则使用非零返回代码退出
-Q 命令将向查询过程的 STDOUT 发送响应
-r [session] 恢复已挂起的会话
-R 尽可能地恢复一个会话,如果无法恢复,则创建一个新的会话
-s shell 指定建立新会话时,所要执行的 shell
-S sockname 指定会话名
-t title 设置标题(窗口名称)
-T term 对窗口使用 $term,而不是 screen
-U 使用 UTF-8 编码
-v 显示版本信息
-wipe [match] 清理无法使用的会话
-x 恢复之前挂起的会话
-X 在指定的会话中,以命令的形式执行

实例:

创建会话(创建一个会话 wget,并打开一个窗口,在窗口中可以运行命令)

jianrry@jianrry:~$ screen -S wget

挂起会话(在会话窗口中,按下 "Ctrl + A + D" 键,会挂起当前的会话)

# 会出现下面的提示 ,其中 wget 是会话名,11798 是进程的 ID 
[detached from 11798.wget]

恢复会话(恢复会话 wget,打开之前的窗口,在窗口中可以继续运行命令)

jianrry@jianrry:~$ screen -r wget

列出会话(列出所有的会话)

jianrry@jianrry:~$ screen -ls

There is a screen on:

	11798.wget	(2021年11月21日 16时17分02秒)	(Detached)

1 Socket in /run/screen/S-jianrry.

结束会话(可以通过会话名 wget 结束会话 wget 并退出)

jianrry@jianrry:~$ screen -XS wget quit

清理会话(清理已经死掉的会话,比如说因为手动杀死对应的进程而死掉的会话)

jianrry@jianrry:~$ screen -wipe