ssh 登录了远程服务器时,如果在前台运行耗时较长的任务, 当 ssh 掉线或关闭窗口时会导致命令停止运行。
hup 与 nohup
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。有两种解决办法
- 让进程忽略 HUP 信号
- 让进程运行在新的会话里,从而成为不属于此终端的子进程
nohup
nohup 的用途是让提交的命令忽略 hangup 信号。使用时只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上 &
来将命令同时放入后台运行,也可用 >filename 2>&1
来更改缺省的重定向文件名。
setsid
setsid 命令可以切换进程所属的终端。setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
NAME
setsid - run a program in a new session
SYNOPSIS
setsid program [arg...]
DESCRIPTION
setsid runs a program in a new session.
OPTIONS
-c, --ctty
Set the controlling terminal to the current one.
关于 subshell
将一个或多个命名包含在“()”中就能让这些命令在 subshell 中运行中。此时新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。
将"&"也放入“()”内之后,所提交的作业并不在作业列表中,无法通过 jobs 来查看,但可以通过 ps -ef
命令查看。
disown
对于已经提交的命令,如果事先没有使用 nohup 或者 setsid 来避免 HUP 信号,可以通过作业调度(运行命令时结尾加 &
或者运行命令后使用 Ctrl + z)配合 disown 命令(这个命令只能用于作业)来补救。
- 用disown -h jobspec来使某个作业忽略HUP信号。
- 用disown -ah 来使所有的作业都忽略HUP信号。
- 用disown -rh 来使正在运行的作业忽略HUP信号。
Ctrl + z
- Ctrl + z 会将当前进程挂起到后台暂停运行。挂起后可用
jobs
命令查看其作业号 - fg 可以将挂起的进程重新放回前台继续运行
- bg 来将挂起的进程放在后台
这样就可以在一个终端内灵活切换运行多个任务。
tmux
tmux 是 Linux 下常用的分屏工具,可以在一个终端中实现多个窗口,每个窗口又可以实现多个 pane 划分。完整资料可以参考 这里。