想让进程一直在后台运行不受关闭终端的影响,有以下四种方案:
nohup
在命令前加上nohup,就会从终端解除进程的关联
同时在结尾加上&来将命令放入后台运行
# 1、在终端1输入
[root@ccc ~]# nohup ping baidu.com &>/dev/null &
[root@ccc ~]# ps -elf | grep [p]ing # 查看进程
4 S root 2034 1979 0 80 0 - 37522 poll_s 15:11 pts/4 00:00:00 ping baidu.com
# 2、关闭终端1
# 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing # 查看进程,父进程变为1即systemd进程
4 S root 2034 1 0 80 0 - 37522 poll_s 15:11 ? 00:00:00 ping baidu.com
setsid
原理与nohup一致,但setsid直接将进程的父PID设为1,即让运行的进程归属init的子进程
除非init结束,该子进程才会结束。当前终端结束不会影响进程的运行
# 1、在终端1执行命令
[root@ccc ~]# setsid ping baidu.com &>/dev/null &
[1] 2062
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2063 1 0 80 0 - 37522 poll_s 15:19 ? 00:00:00 ping baidu.com
[1]+ 完成 setsid ping baidu.com &>/dev/null
# 2、关闭终端1
# 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2063 1 0 80 0 - 37522 poll_s 15:19 ? 00:00:00 ping baidu.com
在子shell中启动进程
命令加上括号
# 1、在终端1输入命令
[root@ccc ~]# (ping vaidu.com &>/dev/null &)
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2103 1 0 80 0 - 37522 poll_s 15:24 pts/4 00:00:00 ping vaidu.com
# 2、关闭终端1
# 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2103 1 0 80 0 - 37522 poll_s 15:24 ? 00:00:00 ping vaidu.com
screen
让进程运行在新的会话里,从而成为不属于此终端的子进程,关闭终端不会被带走
# 安装screen
[root@ccc ~]# yum install screen -y
# 用法1
# 运行命令
终端1输入命令
[root@ccc ~]# screen vim 111.py
[root@ccc ~]# ps -elf | grep [v]im
4 S root 2154 2076 0 80 0 - 31934 sys_pa 15:43 pts/6 00:00:00 screen vim 111.py
5 S root 2155 2154 0 80 0 - 31967 poll_s 15:43 ? 00:00:00 SCREEN vim 111.py
4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py
关闭终端1
在终端2查看
[root@ccc ~]# ps -elf | grep [v]im
5 S root 2155 1 0 80 0 - 31967 poll_s 15:43 ? 00:00:00 SCREEN vim 111.py
4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py
# 重新连接会话
[root@ccc ~]# screen -ls
There are screens on:
2155.pts-6.ccc (Detached)
1678.pts-0.ccc (Attached)
2 Sockets in /var/run/screen/S-root.
[root@ccc ~]# screen -r 2155
# 用法2
# 运行命令
[root@ccc ~]# screen -S cjx_pm
# screen会创建一个执行shell的全屏窗口。可执行任意shell程序
# 输入exit退出该窗口(若该screen窗口唯一,则screen会话结束,否则切换到前一窗口)
# 重新连接会话
[root@ccc ~]# screen -r cjx_pm
# 已经指定了名字,可以不用进程ID直接用名字
# 测试
[root@ccc ~]# screen
[root@ccc ~]# n=1;while true;do echo $n;sleep 1;((n++));done;
按下ctrl+a和ctrl+d
此时整个终端关闭,进程并未结束
[root@ccc ~]# screen -ls
There are screens on:
2266.pts-4.ccc (Detached)
Remove dead screens with 'screen -wipe'.
1 Sockets in /var/run/screen/S-root.
[root@ccc ~]# screen -r 2266 # 进程依旧在运行
# 远程演示
在终端1
[root@ccc ~]# screen -S cz
在终端2执行的命令,终端1会同步显示
[root@ccc ~]# screen -x cz