Linux/Unix:取消命令示例
如何从当前基于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 | 仅删除正在运行的作业。 |