linux关闭一个后台,Linux后台执行的方法 – 关闭、退出不影响

本文详细介绍了在Linux环境中如何确保任务在关闭终端后仍能后台执行,包括使用ampersand(&)、nohup、setsid以及screen等方法。重点讲解了nohup如何避免hangup信号中断进程,setsid创建新会话以避开终端影响,以及screen提供稳定后台运行环境的特点和使用方法。
摘要由CSDN通过智能技术生成

难免会遇到在Linux,后台执行任务。下面,总结了一下关闭窗口任然在后台执行的方法,例如:

#执行一个打包命令

[root@elk.todocker.cn ~]# tar czf /data/backup.tgz /data/backup

1. 采用&

tar czf /data/backup.tgz /data/backup &

ctrl+d #退出 才可以, 如果直接关闭窗口,进程任然会被关闭

使用了&,需要用ctrl+d退出才可以;如果是直接关闭了secureCRT是会导致任务推出

jobs -l 可以查看到

对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行。

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。

例子:

[root@elk.todocker.cn ~]# ping elk.todocker.cn >>/tmp/ping.log &

[1] 9483

[root@elk.todocker.cn ~]# jobs -l

[1]+ 9534 Running ping elk.todocker.cn >> /tmp/ping.log &

[root@elk.todocker.cn ~]# fg

ping elk.todocker.cn >> /tmp/ping.log

^Z

[1]+ Stopped ping elk.todocker.cn >> /tmp/ping.log

[root@elk.todocker.cn ~]# bg

[1]+ ping elk.todocker.cn >> /tmp/ping.log &

2. 采用nohup

nohup tar czf /data/backup.tgz /data/backup

ctrl+z #挂起到后台

bg #后台执行 可以先通过jobs 查看当前有多少job

ctrl+d #或者 关闭窗口 进程任然会在后台执行

例子:

[root@elk.todocker.cn ~]# nohup ping elk.todocker.cn

nohup: ignoring input and appending output to ‘nohup.out’

^Z

[1]+ Stopped nohup ping elk.todocker.cn

[root@elk.todocker.cn ~]# jobs -l

[1]+ 9790 Stopped nohup ping elk.todocker.cn

[root@elk.todocker.cn ~]# bg

[1]+ nohup ping elk.todocker.cn &

[root@elk.todocker.cn ~]# jobs -l

[1]+ 9790 Running nohup ping elk.todocker.cn &

[root@elk.todocker.cn ~]# ps -ef|grep elk.todocker.c[n]

root 9790 9446 0 23:19 pts/1 00:00:00 ping elk.todocker.cn

[root@elk.todocker.cn ~]# fg

nohup ping elk.todocker.cn

^C[root@elk.todocker.cn ~]# ps -ef|grep elk.todocker.c[n]

[root@elk.todocker.cn ~]#

3.采用nohup + &

nohup tar czf /data/backup.tgz /data/backup &

ctrl+d 或者 关闭窗口 进程任然会在后台执行

例子:

[root@elk.todocker.cn ~]# nohup ping elk.todocker.cn &

[1] 9694

nohup: ignoring input and appending output to ‘nohup.out’

[root@elk.todocker.cn ~]# jobs -l

[1]+ 9694 Running nohup ping elk.todocker.cn &

[root@elk.todocker.cn ~]# ps -ef|grep elk.todocker.cn

root 9694 9446 0 23:18 pts/1 00:00:00 ping elk.todocker.cn

root 9747 9446 0 23:19 pts/1 00:00:00 grep --color=auto elk.todocker.cn

而我通常的使用方式为:

nohup ./filename.sh > filename.log 2>&1 &

三点理由:

1)nohup保障进程不会被hangup信号异常中断;

2)将任务放置到后台运行,不占用当前的终端;

3)将错误输出也打印到log中,默认>只有标准输出,错误输出没有。

4.采用(command &)

(tar czf /data/backup.tgz /data/backup &) #父进程设为init进程(进程号为1)会将ppid设置为1,而非当前会话的id,并且jobs查看不到当前的作业。注意这里的括号即是这个方法的重点。

ctrl+d #或者 关闭窗口 进程任然会在后台执行

例子:

[root@elk.todocker.cn ~]# (ping elk.todocker.cn >/tmp/ping.log &)

[root@elk.todocker.cn ~]# jobs -l

[root@elk.todocker.cn ~]# ps -ef|grep elk.todocker.c[n]

root 9959 1 0 23:23 pts/1 00:00:00 ping elk.todocker.cn

[root@elk.todocker.cn ~]#

5.采用setsid run a program in a new session

setsid tar czf /data/backup.tgz /data/backup #会将ppid设置为1,而非当前会话的id

ctrl+d #或者 关闭窗口 进程任然会在后台执行 ,在一个新的会话中运行命令,从而可以避开当前终端发出的HUP信号。

使用方法:setsid COMMAND [ARG]..

例子:

[root@elk.todocker.cn ~]# setsid ping elk.todocker.cn >/tmp/ping.log

[root@elk.todocker.cn ~]# jobs -l

[root@elk.todocker.cn ~]# ps -ef|grep elk.todocker.c[n]

root 9959 1 0 23:23 pts/1 00:00:00 ping elk.todocker.cn

root 10048 1 0 23:24 ? 00:00:00 ping elk.todocker.cn

6.采用disown

tar czf /data/backup.tgz /data/backup

ctrl+z

jobs

bg %N

disown -h %N #N即为job的id disown 可以配合 &使用,效果更好,因为 CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。

disown -rh -a xxx #-a所有 -r所有 -h忽略hup

disown 命令需要安装。

亡羊补牢,为没有使用nohup与setsid的进程加上忽略HUP信号的功能。

使用方法:

将当前正在前台运行的进程放到后台运行;

然后执行disown -h %{jobid} //这里的{jobid}是通过jobs命令中看到的进程前[]中的数字。

7.采用screen

screen

tar czf /data/backup.tgz /data/backup

ctrl+a d #不可以直接ctrl+d 这样会ternimate screen

例子:

[root@elk.todocker.cn ~]# screen;ping elk.todocker.cn >/tmp/ping.log

-bash: screen: command not found

^C[root@elk.todocker.cn ~]# which screen

/usr/bin/which: no screen in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

需要安装 screen 命令。

用screen -dmS session name来建立一个处于断开模式下的会话(并指定其会话名)。

用screen -list 来列出所有会话。

用screen -r session name来重新连接指定会话。 screen -x session_name(id) 连接attached会话

用快捷键CTRL-a d 来暂时断开当前会话。

通过screen来实现稳定的后台运行

screen是建立一个新的全屏虚拟会话终端,这个会话只有在手动输入exit的时候才会退出,在这个会话里执行的命令不用担心HUP信号会对我们的进程造成影响,因此也不用给每个命令前都加上“nohup”或“setsid”了,非常适合我们有规划的执行大量的后台任务,可以非常方便的让我们对这些后台任务进行管理。

使用方法:

screen //立即创建并进入一个会话。

screen -dmS {name} //建立一个处于断开模式下的会话,并根据我们的需要指定其会话名称。

screen -list //列出所有会话。

screen -r {name} //进入指定会话。

ctrl +ad //输入快捷键ctrl +a和d,可暂时退出当前会话。

exit //进入指定会话后执行exit即可关闭该会话。

赞赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值