Linux下后台运行程序的2种常用方式
Linux下后台运行程序的2种常用方式
nohup
命令简介
nohup
的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 &
命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。
将程序放到后台运行,一般有两种方式:
(1)command &
:后台运行,关掉终端会停止运行。
(2)nohup command &
:后台运行,关掉终端也会继续运行。
注意:
(1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录的 nohup.out
文件中。如果当前工作目录的 nohup.out
文件不可写,输出重定向到 $HOME/nohup.out
文件中。如果没有文件能创建或打开用于追加,那么 command 参数指定的命令不可调用。
(2)如果标准错误未显示重定向,那么标准错误默认重定向到与标准输出相同的文件。
命令格式
1 | nohup COMMAND [ARGS] |
选项说明
1 | --help |
常用示例
(1)使用nohup
命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out
的文件中,除非另外指定了输出文件。
1 | nohup ./test.sh & |
(2)标准输出与标准错误输出重定向。
1 | nohup ./test.sh > test.log 2>&1 & |
(3)指定输出文件, 输出被重定向到output.txt文件中
1 | [deng@itcast ~]$ nohup bash a.sh &> error.txt |
注意:
(1)2>&1
标识标准错误输出重定向等同于标准输出重定向,即标准错误输出也重定向到文件test.log;
(2)&
命令是命令放在后台执行,需要放在命令的最后面。
screen
命令简介
screen的功能大体有三个:
- 会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
- 多窗口:在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
- 会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
这三个功能,其实互相交织,组成screen功能繁多的命令集。
命令安装
因为screen是“元老级”的GNU计划项目,所以不管是apt软件源、或者是yum软件源等其他软件源,都存在screen,只需要使用软件源安装命令即可:
1 | # CentOS |
命令用法
screen,通常的命令格式为:
1 | screen [-opts] [cmd [args]] |
复制
通常情况下,使用一下基础命令
即可,高阶命令
过多,比较难记。
注意:
- 命令区分大小写
状态介绍
通常情况下,screen创建的虚拟终端,有两个工作模式:
- Attached:表示当前screen正在作为主终端使用,为活跃状态。
- Detached:表示当前screen正在后台使用,为非激发状态。
通常情况下,不需要关注上面的状态。
基础命令
这里列举一些我认为常用的screen命令,使用以下命令基本满足日常使用。
帮助查询
screen的帮助文档实在是过于详细,以至于查个命令,可能要查几分钟;但是你可以直接使用帮助命令,查询自己需要的命令:
1 | # 查询screen提示 |
通过这个命令,可以查询到大部常用命令。
终端列表
怎么查看已经存在的screen终端呢?很简单,使用命令:
1 | screenv -ls |
新建终端
大部分人使用screen,是为了让进程以前端运行的方式,后端存活(运行)。所以,使用screen新建一个虚拟终端,后端运行很重要。screen创建虚拟终端的方法很多
比如:直接输入screen回车,即可新建一个虚拟终端,**但是这样的名称太乱*(以Linux的hostname命名)***:
screen官方推荐的创建虚拟终端的方法是:
1 | # 创建一个叫Hello的虚拟终端 |
而我一般是使用-R
创建虚拟终端:
1 | # 使用-R创建Hello |
运行后,我们按Ctril+a
,再按d
,即可保持这个screen到后台并回到主终端
三种创建方法比较:
- 使用
-R
创建,如果之前有创建唯一一个同名的screen,则直接进入之前创建的screen - 使用
-S
创建和直接输入screen
创建的虚拟终端,不会检录之前创建的screen(也就是会创建同名的screen)
回到终端
刚刚我们介绍了创建虚拟终端,并回到主终端的方法。那么,如何重新回到虚拟终端呢?
很简单,使用-R
或者-r
命令即可:
1 | # 使用screen -r命令 |
复制
其中:
- pid/name:为虚拟终端PID或Name
清除终端
有时候,我们的进程已经“守护”完毕,不需要这个虚拟终端了,也就是需要释放资源,如何操作呢?
比较推荐的方法,是进入对应虚拟终端,然后输入:
1 | # 退出终端 |
之后,就会回到主终端。
当然,你如果对screen运行程序,确定已经停止运行了,也可以在主终端内,使用命令释放:
1 | # 使用-R/-r/-S均可 |
高阶命令
screen也有一些高级命令。
在虚拟终端内,输入Ctril+a
将等待接受预先设置的绑定键,这个时候可以输入对应的一些命令,来操作虚拟终端,如:
- d:保存会话,后台运行改虚拟终端
- k:关闭对话,等同输入:
exit
- c:新建一个虚拟终端
- ?:显示所有绑定键盘