前言
过程是正在运行的程序,Linux 零碎通常有数百个过程同时运行。本文就来介绍下 Linux 是如何进行过程治理的。
咱们能够看到:
- 查看过程(Viewing processes)
- 查找过程(Finding processes)
- 治理过程(Managing processes)
- 过程的优先级(Prioritizing processes)
- 杀死过程(Killing processes)
- 在后盾运行过程(Running processes in the background)
- 调度过程(Scheduling processes)
查看过程
ps
Linux 内核在创立过程时,会按程序给每个过程调配一个惟一的过程 ID(PID)。一般来说,在过程上执行任何操作,咱们必须指定 PID,有时咱们能够应用名称。
ps
命令是查看过程的次要工具。不应用任何选项来运行该命令,会列出以后登录用户所启动(调用)的过程,以及终端上正在运行的过程。
如果咱们增加了 aux
选项:
a
= 显示所有用户的过程u
= 显示过程的用户 / 所有者x
= 显示未连贯到终端的过程
过程依照它们被启动的程序进行展现,因而你会看到列表是依据 PID 进行排序的。
让咱们简略来看看上面几列的信息:
USER
:调用过程的用户。PID
:过程的 ID。%CPU
:过程占用 CPU 的百分比。%MEM
:过程占用内存的百分比。COMMAND
:启动过程的命令。
查找命令
grep
咱们能够应用 grep
命令来查找指定的过程,假如咱们想要查找所有名称中蕴含 mfsconsole
的过程。
ps aux | grep msfconsole
top
咱们能够应用 top
命令来动静地列举出,依照资源应用状况排序的过程,从最大的开始列举。默认状况下,该列表将每 3 秒刷新一次。
top
治理过程
优先级
内核对过程的优先级有最终决定权,然而咱们能够应用 nice
命令,来倡议应该晋升过程的优先级。nice
命令的值范畴是从 -20(最有可能失去优先权)到 +19(最不可能失去优先权)。
较高的 nice
值转换为低优先级,较低的 nice
值转换为高优先级。
当一个过程启动后,所有的规范过程都以 nice
值 0 来进行启动。
咱们能够应用 nice
命令来设置一个过程启动时的 nice
值,咱们能够应用 renice
来调整一个运行中的过程的 nice
值。
当咱们应用 nice
命令启动一个过程但没有提供任何值时,默认的 nice
值是 10。
nice
命令要求你递增 nice
值,renice
命令想要一个相对的 nice
值。
设置优先级
咱们能够应用 nice
命令来调整一个程序的 nice
值。这容许咱们进步或升高内核提供给该过程的优先级,绝对于其余过程而言。
在右边,我执行 watch -n1 free
来展现零碎内存应用状况的细节。在左边,我让top
命令运行,你能够看到 watch
命令的 PID
是 9717,nice
的值为 0。
让咱们继续执行 watch
命令,只不过这次是用 nice
命令。
nice -15 watch -n1 free
当初咱们能够看到 watch
的nice
值为 15。这里要牢记的几件事:
- 这个
watch
命令的PID
与之前的watch
命令不同。这是因为nice
会启动一个新的过程,而不是更改一个现有的过程。 nice
命令前面的-15
意味着15
。如果咱们想要指定一个正数(高优先级),咱们能够应用双中划线-
。- 上面是执行
sudo nice --10 watch -n1 free
后的样子。是的,如果你要进步优先级,你必须应用sudo
。任何人都能够升高优先级,但只有sudo
能够进步优先级。
扭转优先级
renice
命令接管 -20
到19
的绝对值,并接管过程的PID
。
让咱们再次运行 watch
命令。
watch -n1 free
让咱们来查看下 nice
值,既然咱们没有指定 nice
值,它应该为 0。比起应用 top
,这里我将会应用ps
和grep
,用以简化输入。
咱们能够看到,第八列的值为 0,该值为 nice
的值,PID
的值位于第三列。让咱们应用 renice
试试:
sudo renice -15 14318
咱们能够看到,当初 nice
的值是 -15。咱们也能够应用 top
工具来扭转 nice
值。
在 top
中,按下 R
键,并提供一个PID
:
按下回车键,并提供一个新的 nice
值:
top
胜利的扭转了 nice
值:
杀死过程
kill
你能够通过 kill
命令来进行一个有问题的过程。kill
命令有 64 种不同的 kill
信号,以及语法是kill -signal PID
。如果没有显示的提供信号位,将会默认为SIGTERM
。这里我将重点介绍以下几种:
信号名称 | 数值 | 形容 |
---|---|---|
SIGHUP | 1 | 挂断(HUP)信号。它进行指定的过程,并以雷同的 PID 重新启动它。 |
SIGINIT | 2 | 中断(INT)信号。这是一个强劲的 kill 信号,不保障能起作用,但的确有这样的状况。 |
SIGQUIT | 3 | 外围转储。终止过程并将过程信息保留在内存中,而后它将这些信息保留在当前工作目录下一个名为 core 的文件中。 |
SIGTERM | 15 | 终止(TERM)信号。它是 kill 命令的默认 kill 信号。 |
SIGKILL | 9 | 这是一个相对的 kill 信号。它通过将过程的资源发送到一个非凡的设施 /dev/null 来迫使过程进行。 |
上面的命令会通过 HUP 信号来重启咱们的 watch
命令。
kill -1 14318
上面的命令会确保过程被终止。
kill -9 16318
如果咱们不晓得 PID
,咱们能够应用killall
命令,它接管过程的名称。
killall -9 watch
在后盾运行过程
&
当你执行一个命令时,shell
会进行期待,直到命令实现后才提供另一个命令提醒。咱们能够在后盾运行一个过程,它将持续运行而不须要终端,把终端腾出来做其余工作。咱们在命令的开端增加 &
来做到这一点。
geany sample.txt &
geany
不再占用整个终端。
fg
咱们如何让它回到前台?能够应用带有 PID 的 fg
命令。
fg 18345
bg
你也能够应用 bg
命令来挪动一个过程到后盾。
bg 18345
调度过程
在 Linux 中,咱们能够应用 at
和crond
来调度过程。crond
有点简单,这里重点介绍at
。
at
at
命令对于安顿一项工作在将来某个工夫点运行一次很有用。它设置了 atd
守护过程。守护过程是一个位于后盾的程序,在没有任何用户界面的状况下做本人的事件。
上面是 at
命令执行过程的工夫的语法,工夫能够以多种格局提供。
工夫格局 | 含意 |
---|---|
at 7:20pm | Run at 7:20 PM of current day. |
at 7:20pm June 25 | Run at 7:20 PM on June 25 |
at now + 20 minutes | Run in 20 minutes |
at 7:25pm 06/10/2021 | Run at 7:25 pm on June 10, 2021 |
at noon
咱们能够看到,at
将咱们带入了交互模式,在这里咱们输出了咱们心愿在指定工夫执行的命令。实现后按下 CTRL+D。
atq
应用 atq
来列举出所有预约的 at
工作。