难免会遇到在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即可关闭该会话。
赞赏