一:Linux系统中的job和process
这个job就是系统中的任务,系统会管理每个Shell并分配一个job number(任务号码),如果你子啊一个命令行上执行了多个命令,系统会将整个过程看作一项任务。一个进程可以作为一项任务,多个进程也可以作为一项任务。
任务也分前台任务和后台任务,前台任务会与键盘和终端屏幕交互并占用键盘和终端屏幕,直到任务完成,后台任务不能接收键盘输入,根据设置可能会抑制输出到屏幕的任务,可以同时执行多个任务。
在终端输入gnome-calculator启动计算器把它作为前台任务执行,运行这个命令后会弹出计算机界面,用户可以在此界面进行计算的相关操作。在命令后面加上&表示把这个任务放到后台执行,显示的两个数字分别是任务的任务号码和进程号,演示如下图所示:
.
上面这个是前台运行,而后面这个是后台运行。
管理任务的主要命令,如下表所示:
命令 | 说明 |
jobs | 显示后台任务和暂停任务 |
bg %num | 通过指定任务号码将指定的任务移动到前台 |
fg %num | 通过指定任务号码将指定的任务移动到前台 |
如果在执行命令之后你想暂停,可以使用CRTL + c组合键进行退出。
先来演示一个jobs命令:这个是处于后台运行中的任务。
再来演示以下bg %2,和fg %2,看一下效果是怎么样的:
fg命令是将这个任务从后台切换到前台,bg这个命令是将任务从前台切换到后台运行。
如果在Shell中启动一个特定的程序,就可以使用命令指定任务名称来切换任务的前后台状态。如果在Shell中多次启动同一个程序,再使用指定任务的方式就会出错,这个时候必须指定任务号码。
二:信号控制进程
在Linux中通过信号(Signal)控制进程,信号就是可以传送给进程的消息,通过中断通知进程执行特定的操作。通常进程任务完成任务后会自动消失,但是可以通过键盘操作或执行命令将信号发送放到正在进行的进程,如下图所示:
信号由编号名称来标识,主要信号如下表所示:
信号编号 | 信号名称 | 说明 |
1 | SIGHUP | 通过终止终端断开进程 |
2 | SIGINT | 中断进程(使用ctrl + c) |
9 | SIGKILL | 杀死进程,即强制终止进程 |
15 | SIGTERM | 结束进程(默认) |
18 | SIGCONT | 恢复暂停的进程 |
将信号发送给一个或者多个进程,可以使用kill命令,kill命令可以终止用户所属的进程,root用户可以使用kill命令终止所有的进程。当未指定特定信号执行kill命令时,将默认的发送SIGTERM(信号编号15),这个信号会使进程结束终止。9这个信号通常用来强制删除一个不正常的进程.kill命令的用法有很多,和信号搭配可以管理系统中的任务和进程,要想使用,就必须熟悉这几个信号的含义。
kill命令的-l选项可以列出当前kill可以使用的信号。演示如下图所示
开启两个终端,在终端1执行bc命令开启bc进程,然后在终端2中杀死这个进程。这时终端1接收到了信号会强制终止bc进程,进入终端1会显示这个进程已经杀死。
在上面,使用ps -eo pid,comm | grep bc命令可以查看bc的PID,在使用kill命令的SIGKILL信号杀死这个进程。
默认信号(SIGTERM)在终止程序之前会为每个应用程序执行必要的终止处理,然后自行终止该进程,例如释放资源空间和删除锁定文件。如果SIGTERM没有终止该进程,则在必要的情况下会使用SIGKILL强制中止。如果将SIGKILL发送到进程中,它将不在接受信号的情况下被内核杀死,因此将不在进行任何清理操作。
通过指定进程名称,可以使用killall命令发送信号,即使多次执行同一程序,系统也会成为每一个进程分配不同的PID。当用户想终止具有相同名称的多个进程时,可以使用killall命令:
格式:killall [选项] [信号名称 | 信号编号] 进程名称
在终止进程之前,先弄清楚进程的PID,ps和pgrep命令都可以检查进程的PID。然后执行killal -9 bc命令就可以终止两个运行的bc进程,演示如下图所示:
kill是一个很实用的命令,在指定任务号码和进程号码之时有所区别。指定任务号码需要使用%+这种方式,默认后面指定的是进程号。
三:Shell脚本与任务总结