介绍
Linux服务器像您可能熟悉的任何其他计算机一样运行应用程序。 对于计算机,这些被认为是“过程”。
虽然Linux将在一个进程的生命周期中处理低级的幕后管理,但是您需要一种与操作系统交互的方式,以便从更高级别管理它。
在本指南中,我们将讨论过程管理的一些简单方面。 Linux为此提供了丰富的工具集合。
我们将在Ubuntu 12.04 VPS上探索这些想法,但任何现代Linux发行版都将以类似的方式运行。
如何在Linux中查看运行的进程
最佳
找出哪些进程正在运行在服务器上的最简单方法是运行top
的命令:
top
top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers
Swap: 0k total, 0k used, 0k free, 258976k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0
8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
顶部的信息块提供系统统计信息,例如系统负载和任务总数。
你可以很容易地看到有1个正在运行的进程,55个进程正在休眠(也称为空闲/不使用CPU资源)。
底部具有正在运行的进程及其使用统计信息。
htop
改进版top
,称为htop
,是存储库中可用。 使用此命令安装:
sudo apt-get install htop
如果我们运行htop
命令,我们会看到,有一个更人性化的显示器:
htop
Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05
CPU[ 0.0%] Tasks: 21, 3 thr; 1 running
Swp[ 0/0MB] Uptime: 00:58:11
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init
311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid
314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae
389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys
407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5
408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5
553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br
您可以了解更多有关如何使用顶部和HTOP在这里。
如何使用ps列出进程
这两个top
和htop
提供一个漂亮的界面,以查看正在运行的类似于图形任务管理器的进程。
然而,这些工具并不总是足够灵活,足以涵盖所有情况。 所谓功能强大的命令ps
往往是回答这些问题。
当无参数调用时,输出可能有点缺乏:
ps
PID TTY TIME CMD
1017 pts/0 00:00:00 bash
1262 pts/0 00:00:00 ps
此输出显示与当前用户和终端会话相关联的所有进程。 这是有道理的,因为我们只运行bash
和ps
这个终端当前。
为了更全面地了解本系统上的进程,我们可以运行以下命令:
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 24188 2120 ? Ss 14:28 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S 14:28 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 14:28 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S 14:28 0:00 [migration/0]
root 7 0.0 0.0 0 0 ? S 14:28 0:00 [watchdog/0]
root 8 0.0 0.0 0 0 ? S< 14:28 0:00 [cpuset]
root 9 0.0 0.0 0 0 ? S< 14:28 0:00 [khelper]
. . .
这些选项告诉ps
展现在用户友好的格式由所有用户拥有(无论其终端联合体)的进程。
要查看树状视图中 ,层级关系所示,我们可以运行这些选项下面的命令:
ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0]
2 6 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 7 0 0 ? -1 S 0 0:00 \_ [watchdog/0]
2 8 0 0 ? -1 S< 0 0:00 \_ [cpuset]
2 9 0 0 ? -1 S< 0 0:00 \_ [khelper]
2 10 0 0 ? -1 S 0 0:00 \_ [kdevtmpfs]
2 11 0 0 ? -1 S< 0 0:00 \_ [netns]
. . .
如可以看到,该方法kthreadd
被示为是的父ksoftirqd/0
过程和其他。
有关进程ID的注意事项
在Linux和Unix系统中,每个进程被分配一个进程ID,或PID。 这就是操作系统如何识别和跟踪进程。
得到一个进程的PID的快速方法是使用pgrep
命令:
pgrep bash
1017
这将简单地查询进程ID并返回它。
在引导衍生所述第一进程是init,被赋予“1”的PID。
pgrep init
1
然后,此进程负责生成系统上的每个其他进程。 给较后的过程较大的PID数。
一个进程的父是负责产卵它的进程。 如果进程的父进程被杀死,那么子进程也会死亡。 父进程的PID被称为PPID。
你可以看到在许多流程管理应用程序,包括列标题PID和PPID top
, htop
和ps
。
用户和操作系统之间关于进程的任何通信涉及在操作期间的某个时刻在进程名称和PID之间进行转换。 这就是为什么公用程序告诉你PID。
如何在Linux中发送进程信号
在Linux中的所有进程响应信号 。 信号是一种os级别的方式来告诉程序终止或修改他们的行为。
如何通过PID发送过程信号
传递信号以程序的最常见的方法是使用kill
命令。
正如您所期望的,此实用程序的默认功能是尝试杀死进程:
kill PID_of_target_process
该发送TERM信号的过程。 TERM信号告诉进程请终止。 这允许程序执行清理操作并顺利退出。
如果程序出现异常,并给出TERM信号时不退出,我们可以通过将升级的信号KILL
信号:
kill -KILL PID_of_target_process
这是一个不发送到程序的特殊信号。
相反,它被给予操作系统内核,其关闭该过程。 这用于绕过忽略发送给它们的信号的程序。
每个信号都有一个相关的数字,可以传递,而不是名称。 例如,您可以传递“-15”而不是“-TERM”,而“-9”而不是“-KILL”。
如何使用信号用于其他目的
信号不仅用于关闭程序。 它们也可用于执行其他操作。
例如,许多守护程序将重新启动时,他们被给予HUP
,或挂断的信号。 Apache是一个这样操作的程序。
sudo kill -HUP pid_of_apache
上述命令将使Apache重新加载其配置文件并恢复服务内容。
您可以通过键入列出所有可能与kill发送的信号:
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
. . .
如何按名称发送进程信号
尽管传统的发送信号的方式是通过使用PID,但是也有使用常规的进程名称来执行此操作的方法。
该pkill
命令工作在几乎完全方法一样kill
,但它在一个进程名称,而不是工作:
pkill -9 ping
上面的命令相当于:
kill -9 `pgrep ping`
如果您想发送信号到某个进程的每个实例,您可以使用killall
命令:
killall firefox
上述命令将向计算机上运行的每个firefox实例发送TERM信号。
如何调整流程优先级
通常,您需要调整在服务器环境中哪些进程被赋予优先级。
一些进程可能被认为对您的情况是关键任务,而其他进程可能会在可能剩余的资源时执行。
Linux的通过一个名为值控制正派优先。
高优先级任务被认为不太好听 ,因为它们不共享资源。 低优先级的进程,在另一方面,由于他们坚持只以最少的资源都不错 。
当我们跑top
在文章的开头,出现了标有“NI”一列。 这是进程的nice值:
top
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019600k total, 324496k used, 695104k free, 8512k buffers
Swap: 0k total, 0k used, 0k free, 264812k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
取决于系统,Nice值的范围可以在“-19 / -20”(最高优先级)和“19/20”(最低优先级)之间。
要具有一定的nice值运行一个程序,我们可以用nice
命令:
nice -n 15 command_to_execute
这仅在开始新程序时有效。
要改变一个已经执行程序的nice值,我们使用一个名为工具renice
:
renice 0 PID_to_prioritize
注意:当nice根据需要使用命令名称时,renice通过调用进程PID来操作
结论
过程管理是新用户有时难以掌握的主题,因为所使用的工具与其图形对应方不同。
然而,这些想法是熟悉和直观的,有一点练习,将变得自然。 因为进程涉及到你对计算机系统所做的一切,所以学习如何有效地控制它们是一项基本技能。