Linux教程之进程的后台运行(&,bg, fg, jobs, nohup)

Linux教程之进程的后台运行(&,bg, fg, jobs, nohup)

适用于 ubuntu 20.04
ubuntu 20.04 是 “西柚云” 主要使用的操作系统 西柚云官网

让进程后台运行的方式

  1. &

    sleep 10086 &
    
  2. ctrl + z 和 bg 搭配

    sleep 10010
    # 按 ctrl + z
    # 在终端输入 bg
    bg 
    
  3. 使用 nohup 的方式后台运行进程

    nohup sleep 1111 &
    

查看后台运行的进程(jobs)

jobs -l

将后台运行的进程转到前台运行(fg)

可以根据后台运行的进程编号将对应的进程转到前台来运行,编号可通过 jobs 命令查看

# 查看进程编号
jobs
# 将 1 号后台运行的进程转到前台运行
fg 1

# 不指定编号,默认将编号最大的进程转到前台运行
fg

补充内容

后台运行的进程在终端关闭后还能继续运行吗?

分情况,使用上文中的方式 1 和方式 2 运行的后台进程会在终端关闭后被杀死。

而使用 nohup 运行的后台进程在终端关闭后而主机还在运行的情况下继续运行。

下面我们来介绍一下原理:

假设我们通过 SSH 协议连接到一台 Linux 主机,连接后我们可以在当前的终端执行命令。

# 我们以上述的 3 种方式运行后台进程
 ## &
sleep 10010 &
 ## ctrl + z, bg
sleep 10086
 ## nohup
nohup sleep 111111 &

进程的组织结构:

扫描二维码关注公众号,回复: 14658708 查看本文章

Linux 中进程的组织结构就像一棵树

ps -ef | grep <username>
pstree -anph | grep sshd -A 5

# 一般来说,父进程被杀死后,子进程也会被杀死,但使用 nohup 方式运行的后台进程会在 sshd 进程被杀死后将
# 进程托管给 linux 的 init 进程,这样这个进程就会继续运行了。

ps -ef | grep sleep

使用 & 和 (ctrl + z,bg)方式运行的进程在终端关闭后就被杀死了,而使用 nohup 后台运行的进程在终端关闭后还运行在机器中。这是因为通常终端与 Linux 服务器是通过 SSH 协议连接的,每次连接都会建立一个 sshd 进程,在这个终端下运行的所有进程都会作为这个 sshd 进程的子进程。终端关闭后 sshd 进程就结束了,于是它的子进程也就被杀死了。

使用 nohup 运行的后台进程会在终端关闭后将进程托管到 Linux 的 init 进程,这个进程是一直在服务器中运行的,所以该进程的子进程不会因为父进程被杀死而结束。

记录日志:

在让进程后台运行时,我们通常需要记录日志,用于了解进程的运行情况。

比如运行 jupyter notebook 时,我们通常将日志输入到文件中

nohup jupyter notebook 1>jupyter.log 2>&1 &

这里的 2 表示的是错误输出,1 表示的是标准输出,标准输出会输出到终端。上述的 2>&1 会将标准错误输出重定向标准输出(终端),1>jupyter.log会将标准输出中的内容重定向到 jupyter.log 文件中,这样进程输出的日志信息就全都记录在 jupyter.log 文件中了,查看 jupyter.log 文件中的内容,就能知道进程的运行状态了。

猜你喜欢

转载自blog.csdn.net/weixin_64316191/article/details/127955269