Linux 后台任务
目录
¶概述
在 Linux 系统中,使用某个命令后,这个命令对应的执行程序就会在系统的终端或工作台的前台页面运行(程序运行相关的输出结果会输出到终端上)。某时我们可能希望由于一个作业的运行而控制了整个屏幕。共有以下几种方式能够让进程在后台运行
¶方式一:&
通过在某个命令后面增加 &
字符就可以实现将作业放在终端后台运行。例如,将深度学习训练的脚本放在后台运行如下:
1 | python train.py & |
✨ 通过这种方式在后台运行作业时需要注意:需要用户交互的命令最好不要放在后台执行,因为由于程序需要等待用户输入,然后程序却运行在后台,用户不能和它进行交互,就会造成此任务阻塞在后台。另一方面,作业在后台运行一样会将结果输出到屏幕上,影响到前台终端。所以,最好使用下面的方法把后台程序的输出重定向到某个文件中:
1 | command > out.file 2>&1 & |
通过这种方式,所有的标准输出和错误输出都将被重定向到 out.file
的文件中
❓ 2>&1
是什么意思?
¶方式二:nohup
使用 &
命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup 命令可以在你退出帐户之后继续运行相应的进程。nohup 就是不挂起的意思( no hang up)。该命令的一般形式为:
1 | nohup command & |
🎶 如果使用 nohup 命令提交作业,在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out
的文件中,如果想要自定义输出文件,可以使用如下方式
1 | nohup command > myout.file 2>&1 & |
使用了 nohup 命令之后,有可能造成当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用 nohup 命令后,需要使用 exit 正常退出当前用户,这样才能保证命令一直在后台运行
¶其他
如果想要查看当前终端有多少在后台运行的命令,可以使用 jobs
命令,jobs -l
选项可显示所有任务的 PID,jobs 的状态可以是 running,stopped,terminated
,但是如果任务被终止了,shell 将会从当前的 shell 环境已知的列表中删除任务的进程标识。