在linux中,大多数程序都是以命令行方式启动的(感觉有点废话)。默认情况下,程序是会一直在当前终端中运行,并将输入和输出都连接到当前打开的终端。
实际使用时,即使当前终端断开,也需要进程能够一直运行,本文罗列一下可以让进程持续运行的几种方式。
1. 标准service
大部分采用rpm、deb等发行的安装包,默认都提供此种方式。而且通常情况下当程序安装完成后,会自动注册到系统的服务列表(通常是在/etc/init.d/
目录创建软连接);当然也可以自己根据当前系统手动创建对应的文件来实现服务的注册(例如centos7+的systemctl
方式)。
2.nohup方式
最经典的搭配即为如下方式:
nohup <command> &
不过此种情况下,所有的控制台输出默认都会被保存到nohup.out文件中,因此经常造成此文件巨大无比,所以实际使用时,经常是使用此种方式:
nohup <command> >/dev/null 2>&1 &
这里有个小插曲,因为很久没有研究后台运行这块了,我一直以为单纯的使用&
就可以让进程在脱离当前会话终端长期运行,经过实践后发现并不是;而我实际一直使用的仅仅添加&
就能让进程在后台运行的方式其实是下面这种方式
3.在命令后面添加&
,然后将整条命令放到脚本里启动
新建一个run.sh
文件,然后在其中写入如下内容:
<command> &
然后chmod +x run.sh
为其添加可执行权限,之后./run.sh
来执行这个脚本,此时进程虽然会输出到当前终端会话,但其实进程已经脱离了当前会话,此时你可以安全的推出会话,进程也不会退出。
4.使用screen
方式
此方式实为开启了一个伪终端,进程是在伪终端中执行的,进程是通过伪终端挂载在1号进程上的
- 创建screen:
screen -dmS screen1
- 查看screen列表:
screen -list
: - 连接到某个screen:
screen -r screen1
连接到screen后,正常执行命令启动进程(无需使用nohop,也不用添加&),之后使用ctrl + a + d
从当前screen断开即可
5.使用setsid
命令
此方式实为设置启动后的进程的父进程为1号进程来实现的:
setsid command
6.使用tmux
tmux和screen及其类似,都是使用伪终端的方式,目标进程都是挂载在伪终端中的
- 创建会话:
tmux
- 退出并销毁会话(在会话中执行):输入
exit
或按下ctrl + d
- 退出但保留会话(在会话中执行):输入
ctrl + b d
- 接入某个会话:
tmux attach -t <会话编号>
- 查看会话列表:
tmux ls
其他tmux高阶玩法可以自行百度。
写在最后:前两天偶然想起以前的一个痛点问题,就是如果某个进程通过脚本(run.sh
方式启动)或者nohup <command> &
方式启动,当终端退出后如何重新查看进程的控制台输出;网上找了一通,答案都是大写的NO,不过皇天不负有心人,最后在某个犄角旮旯的角落找到了一个还能凑合使用的方案reptyr <pid>
。此命令肯定是要安装的,安装完后就可以使用此命令查看目标进程的控制台输出了,但重新接入后是无法退出的,如果按下ctrl + c
会终止目标进程;如果按下ctrl + z
,好吧,按下这个什么反应也没有,唯一的退出方式就是右上角关闭当前终端窗口。
完。