后台任务稳定运行方案–不受终端关闭或者远程(ssh等)连接失败影响

介绍


我们经常会碰到这样的问题,用 ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。

从Linux知识可以看出,at的单次任务提交以后,就脱离了该终端的控制,是一种方案,其实例行任务方案crontab也可以,不过它是循环执行的,如果实在想不起来其他方案,crontab运行以后,再注释掉改任务也是一种方法。

nohup 使用方式


方法有很多,这里先只讲 nohup 这种方式。

nohup 是 Linux 的一个常用命令,当你想要在退出账户或者关闭终端后进程仍在运行时,就可以使用 nohup 命令。nohup 就是不挂断的意思(no hang up)。

hangup 名称的来由


在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。

顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息:

nohup --help
Usage: nohup COMMAND [ARG]...
  or:  nohup OPTION
Run COMMAND, ignoring hangup signals.

      --help     display this help and exit
      --version  output version information and exit

If standard input is a terminal, redirect it from an unreadable file.
If standard output is a terminal, append output to 'nohup.out' if possible,
'$HOME/nohup.out' otherwise.
If standard error is a terminal, redirect it to standard output.
To save output to FILE, use 'nohup COMMAND > FILE'.

NOTE: your shell may have its own version of nohup, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report nohup translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/nohup>
or available locally via: info '(coreutils) nohup invocation'

可见,nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&“来将命令同时放入后台运行,也可用”>filename 2>&1″来更改缺省的重定向文件名。

基本使用


[root@somehost test]# nohup ping www.code404.icu &
[1] 416
[root@somehost test]# nohup: ignoring input and appending output to ‘nohup.out’
[root@somehost test]# ps -ef |grep 416
leenhem    416     9  0 16:32 tty1     00:00:00 ping www.code404.icu
leenhem    418     9  0 16:32 tty1     00:00:00 grep --color=auto 416

可见我们把 ping www.baidu.com 放到后台执行了,由于没有指定重定向,默认情况下标准输出和标准错误缺省会被重定向到当前目录的 nohup.out 文件中:

[root@somehost test]#  tail -f nohup.out
PING www.code404.icu (182.92.75.185) 56(84) bytes of data.
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=1 ttl=44 time=6.01 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=2 ttl=44 time=6.65 ms

--- www.code404.icu ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 6.012/6.332/6.652/0.320 ms
PING www.code404.icu (182.92.75.185) 56(84) bytes of data.
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=1 ttl=44 time=6.11 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=2 ttl=44 time=6.49 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=3 ttl=44 time=6.71 ms

重定向标准输出


[root@somehost test]# nohup ping www.code404.icu > ping.txt &
[2] 429
[root@somehost test]# nohup: ignoring input and redirecting stderr to stdout
[root@somehost test]# tail -f ping.txt
PING www.code404.icu (182.92.75.185) 56(84) bytes of data.
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=1 ttl=44 time=6.10 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=2 ttl=44 time=6.55 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=3 ttl=44 time=6.56 ms

重定向标准输出和标准错误


[root@somehost test]# nohup ping www.code404.icu > ping.txt 2>&1 &
[1] 4441
[root@somehost test]# ttail -f ping.txt
nohup: ignoring input
PING www.code404.icu (182.92.75.185) 56(84) bytes of data.
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=1 ttl=44 time=6.05 ms
64 bytes from 182.92.75.185 (182.92.75.185): icmp_seq=2 ttl=44 time=6.50 ms

与示例二相比,多了2>&1,下面来解释下这是什么意思。

扩展


基本符号的含义

  • 0 表示 stdin 标准输入
  • 1 表示 stdout 标准输出
  • 2 表示 stderr 标准错误

command > file 命令其实是一个缩写,实际上是 command 产生的标准输出重定向到 file 中,也就是说相当于执行了 command 1 > file。

2>&1

2 是标准错误,1是标准输出,&1可以理解为用标准输出的引用。实际就是把标准错误也重定向到file中。

综上,nohup ping www.code404.icu > ping.txt 2>&1 & 的意思是后台执行ping命令,把标准输出和错误标准错误都重定向ping.txt文件里。

版权声明:本文为作者原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原创文章,作者:老C,如若转载,请注明出处:https://www.code404.icu/958.html

发表评论

登录后才能评论