后台任务与nohup命令

您所在的位置:网站首页 nohup进程 后台任务与nohup命令

后台任务与nohup命令

2023-04-15 12:03| 来源: 网络整理| 查看: 265

后台任务与nohup命令

作者:佚名 浏览:212 发布时间:2022-10-31

在 Linux 的终端中运行某些命令时,我们往往希望让它们在后台运行稳定运行而不受本地关闭终端窗口或网络断开连接的干扰。

先来了解一下:当用户注销(logout)或者网络断开时,终端会收到 SIGHUP 信号从而关闭其所有子进程。即 用户准备退出 session 时,系统向该 session 发出SIGHUP信号linux 关闭进程,session 将SIGHUP信号发给所有子进程,子进程收到SIGHUP信号后,自动退出。

首发于:

因此,要让命令在后台运行稳定的运行有两种途径:

如果你不想看完全文,那么只需记住下面这两个最常用的方法即可,其中 command 表示你要在后台稳定运行的命令:

# 直接使用 nohub nohup Command & # 或同时重定向标准输出和标准错误到 myout.file nohup Command > myout.file 2>&1 &

使用 & 开启后台任务

在类UNIX系统的命令行模式下,用户可使用 & 操作符以启动进程并使之运行于后台。

但后台任务继承当前 session(对话,就是终端窗口)的标准输出(stdout)和标准错误(stderr);因此,后台任务的所有输出依然会同步地在命令行下显示。但它不再继承当前session的标准输入(stdin)。

对比后面见到的守护进程的创建要求,可以看出单单使用 & 是不能保证命令在各类场景中一直在后台稳定运行的。

前后台进程的切换:

后台进程的进程组ID(即PGID)与控制终端进程组ID(即TPGID)不同,因而也可以此辨识后台进程。我们可以验证一下:

# 同时显示:进程ID(PID),父进程ID(PPID),进程组ID(PGID),终端进程组ID(TPGID),会话ID(SID),进程名称 ps xao pid,ppid,pgid,tpgid,sid,comm

# 下面是终端三的显示结果 和 相关备注:

####################################### # 终端一: 运行 ping baidu.com & 10215 10071 10215 10215 10215 zsh 10703 10215 10703 10215 10215 ping # 第三列和第四列 10703 10215 并不相同 # 终端二: 运行 ping baidu.com 10723 10071 10723 10762 10723 zsh 10762 10723 10762 10762 10723 ping # 终端三: 运行 ps xao pid,ppid,pgid,tpgid,sid,comm 10393 10071 10393 10769 10393 zsh 10769 10393 10769 10769 10393 ps

disown命令

disown命令。它可以将指定任务从"后台任务” 列表(jobs命令的返回结果)之中移除。一个 “后台任务” 只要不在这个列表之中,session 就肯定不会向它发出SIGHUP信号。

命令示例:

# 移出最近一个正在执行的后台任务 disown # 移出所有正在执行的后台任务 disown -r # 移出所有后台任务

disown -a # 不移出后台任务,但是让它们不会收到SIGHUP信号 disown -h # 根据jobId,移出指定的后台任务 disown %2 disown -h %2 disown -ah disown -rh

用法:

node server.js & disown

注意:

使用disown命令之后,还有一个问题。那就是,退出 session 以后,如果后台进程与标准I/O有交互,它还是会挂掉。

这是因为"后台任务"的标准 I/O 继承自当前 session,disown命令并没有改变这一点。一旦"后台任务"读写标准 I/O,就会发现它已经不存在了,所以就报错终止执行。

为了解决这个问题,需要对"后台任务"的标准 I/O 进行重定向。比如:

node server.js > stdout.txt 2> stderr.txt

nohup 命令

还有比disown更方便的命令,就是nohup。

nohup 的原理:

也就是说,nohup命令实际上将子进程与它所在的 session 分离了。

注意,nohup命令不会自动把进程变为"后台任务”,所以必须加上&符号。

常见的两种用法:

nohup Command & nohup Command > myout.file 2>&1 &

setsid 命令

如果我们的进程不属于接受 SIGHUP 信号的终端的子进程,那么自然也就不会受到 SIGHUP 信号的影响了。setsid 就能帮助我们做到这一点。

用法:也只需在要处理的命令前加上 setsid 即可。示例:

setsid ping www.ibm.com

另可参考下文中 setsid 函数的作用。补充:各种任务

守护进程的创建步骤:

补充:命令的重定向

先看下面两个示例:

command > /dev/null command > /dev/null 2>&1

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

补充:ps命令

ps 命令的基本用法:

ps (Unix) - 维基百科

ps程序(“process status"的简称)可以显示当前运行的进程。一个相关的Unix工具top则可以查看运行进程的实时信息

ps有很多选项。在支持SUS和POSIX标准的操作系统上,ps常以选项-ef运行,其中”-e"选择每一个(every)进程,"-f"指定"完整”(full)输出格式。这些系统上的另一个常见选项是-l,它指定"长”(long)输出格式。

由于历史原因linux 关闭进程,大多数源自BSD的系统无法接受SUS和POSIX的标准选项(例如,“e"或”-e"选项将显示环境变量)。在这样的系统中,ps常使用辅助非标准选项aux,其中"a"列出了一个终端上的所有进程,包括其他用户运行的,“x"列出所有没有控制终端的进程,“u"添加了一列显示每个进程的控制用户。需要注意的是,为了最大的兼容性,使用此语法时"aux"前没有”-"。此外,在aux之后添加"ww"可以显示进程的完整信息,包括所有的参数,例如"ps auxww”。

示例:

$ps # ps命令和grep结合 ps -A | grep firefox-bin # 或直接使用pgrep pgrep -l firefox-bin # 查看以root用户运行的进程 ps -U root -u

如何查看守护进程?

使用 ps axj :

从上面命令的结果中可以发现一些 守护进行特点:

参考

以上由丰涵科技用户整理投稿发布,希望对大家有所帮助!

linux 关闭进程linux关闭进程wps关闭后进程不关闭

上一篇:Linux文件查找和打包压缩 下一篇:《防疫健康码国际版最新二维码》软件优势


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3