Linux/Unix:取消命令示例

时间:2020-01-09 10:45:58  来源:igfitidea点击:

如何从当前基于bash/ksh或者POSIX的shell中删除作业?
作业控制不过是根据需要停止/挂起进程(命令)并继续/继续执行的能力。
这是使用您的操作系统和shell(例如bash/ksh或者POSIX shell)完成的。

fg命令将当前Shell环境中的后台作业移至前台。
要删除/删除作业或者告诉Shell不要发送HUP信号,请使用disown命令。
此命令是bash或者ksh93 shell的一部分。

语法

基本语法如下:

discover jobID

或者

disown jobID1 jobID2 ... jobIDN

或者

disown [options] jobID1 jobID2 ... jobIDN

关于BASH和KSH93 disown命令的注意事项- 当登录shell终止时,在ksh shell上的disown命令使Shell不向每个给定作业或者所有活动作业(如果省略了作业)发送HUP信号。

bash shell上的disown命令可以删除作业,也可以使shell不向每个给定作业或者所有作业发送HUP信号。

disown命令示例

在开始使用fg命令之前,您需要在系统上启动几个作业以进行演示。
执行以下命令以启动作业:

xeyes &
gnome-calculator &
gedit fetch-stock-prices.py &

最后,在前台运行ping命令:

ping theitroad.local

要暂停ping命令作业,请按Ctrl-Z键序列。
使用jobs -l命令列出当前的作业,包括一个jobID:

$ jobs -l

输出示例:

[1]-  4581 Running                 xeyes &
[2]+  4584 Running                 ping theitroad.local &

其中:

  • [1]进程号的作业ID(PID)4581,用于命令xeyes
  • [2]进程号的jobID(PID)4584,用于命令ping theitroad.local

如果没有任何选项,则会从活动作业表中删除每个jobID,即bash shell使用其当前作业的概念,该概念由jobs -l命令中的+符号显示:

$ disown

如何删除所有作业?

传递-a选项来取消命令,执行:

$ disown -a
## You should not see any jobs running on screen ##
$ jobs -l

如何仅删除正在运行的作业?

传递-r选项来取消命令,执行:

$ disown -r
$ jobs -l

在后台从shell提示符退出后,如何继续运行作业?

SIGHUP(挂断)信号由您的系统用于控制终端或者控制过程终止。
您也可以使用SIGHUP重新加载配置文件并打开/关闭日志文件。
换句话说,如果您从终端注销,所有正在运行的作业将被终止。
为了避免这种情况,您可以传递-h选项来取消命令。
此选项标记每个jobID,以便如果Shell收到SIGHUP,则不会将SIGHUP发送到该作业。
语法为:

$ disown -h jobID
$ disown -h %2

作业ID以%字符开头; %n标识作业n,而%%标识当前作业。
在以下示例中,在后台使用apt-get命令更新基于Debian或者Ubuntu Linux的服务器:

## Step 1: update system ##
apt-get upgrade &> /root/system.update.log &
 
## Step 2: Mark apt-get so that SIGHUP is not sent when you exit and go for tea ##
disown -h 
 
## Step 3: exit from root shell ##
exit

请注意,出于相同的目的,您也可以使用nohup命令将信号SIGHUP设置为在Linux或者Unix上的任何命令都被忽略。

disown命令选项

在bash(1)命令手册页中:

选项说明
-a如果未提供jobID,则删除所有作业。
-h标记每个jobID,以便如果Shell收到SIGHUP,则不会将SIGHUP发送到该作业。
-r仅删除正在运行的作业。