Linux进程管理
进程是已启动的可执行程序的运行中实例。/proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID。
现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。
每个新进程分配有一个唯一的进程ID(PID),满足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。
任何进程可创建子进程。所有进程都是第一个系统进程的后代。RHEL7上,第一个系统进程是systemd。

通过fork例程,子进程继承安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec其自己的程序代码。通常,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求(wait)。在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称作僵停。父进程在子进程退出时收到信号而被唤醒,清理剩余结构,然后继续执行其自己的程序代码。

Excuting //运行态
Ready //就绪态,也可以称作睡眠态
Uninterruptible sleep //不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒
Interruptible sleep //可中断的睡眠。可随时唤醒
Zombie //僵尸进程。正常运行结束了,但是不释放占据的内存
Stopped //停止态,暂停于内存中,但不会被调度,除非手动启动之进程睡眠的原因:
当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间
在多任务处理操作系统中,每个CPU(或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。
Linux进程状态
| 标志 | 内核定义的状态名称和描述 |
|---|---|
| R | TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪 |
| S | TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中 |
| D | TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态 |
| K | TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态 |
| T | TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复) |
| T | TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志 |
| Z | EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放 |
| X | EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到 |
| < | 高优先级进程 |
| N | 低优先级进程 |
| + | 前台进程组中的进程 |
| l | 多线程进程 |
| s | 会话进程首进程 |
现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出实际具有的核心数。
通过时间分片技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。
执行此切换的Linux内核部分称为进程调度程序。
要修改进程的优先级可以通过调整进程的nice值来实现,nice值越小,优先级越高:
nice值的范围是(-20,19),-20对应100,19对应139
由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。
由于并非所有进程都以同样的方式创建,可为采用SCHED_NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值。一个进程可以有40种不同级别的nice值。
这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0
nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间
为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。
普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别
进程优先级调整:调整nice值//调整已经启动的进程的nice值:
renice NI PID(例:renice 3 3704)
//在启动时指定nice值:(-20,19)
nice -n NI COMMAND
[root@mr ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 244948 13852 ? Ss Jul05 0:04 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S Jul05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Jul05 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Jul05 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< Jul05 0:00 [kworker/0:0H-kblockd]
root 9 0.0 0.0 0 0 ? I< Jul05 0:00 [mm_percpu_wq]
...
root 4013 0.0 0.0 0 0 ? I 21:37 0:01 [kworker/3:3-events_powe
root 4016 0.0 0.0 0 0 ? I 21:49 0:00 [kworker/0:0-ata_sff]
root 4023 0.0 0.0 0 0 ? I 21:52 0:00 [kworker/1:3-memcg_kmem_
root 4024 0.0 0.0 0 0 ? I 21:55 0:00 [kworker/0:1-ata_sff]
root 4026 0.0 0.5 153356 10196 ? Ss 21:58 0:00 sshd: root [priv]
root 4030 0.0 0.2 153356 5548 ? R 21:58 0:00 sshd: root@pts/1
root 4031 0.0 0.1 26212 3880 pts/1 Ss 21:58 0:00 -bash
root 4052 0.0 0.1 58688 3872 pts/1 R+ 21:59 0:00 ps aux
[root@mr ~]#
[root@mr ~]# nice -n 15 sleep 2000
[root@mr ~]# ps aux | grep sleep
root 4094 0.0 0.0 7280 812 pts/1 SN+ 22:06 0:00 sleep 2000
root 4100 0.0 0.0 12108 1032 pts/2 S+ 22:07 0:00 grep --color=auto sleep
[root@mr ~]#
[root@mr ~]# ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 244948 13852 ? Ss Jul05 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root 2 0.0 0.0 0 0 ? S Jul05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Jul05 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Jul05 0:00 [rcu_par_gp]
[root@mr ~]# ps -el | head -3
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 61237 do_epo ? 00:00:04 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
[root@mr ~]#
[root@mr ~]# ps -elf | head -2
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 61237 do_epo Jul05 ? 00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
[root@mr ~]# ps -el | head -2
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 61237 do_epo ? 00:00:04 systemd
[root@mr ~]# ps -el | grep sleep
0 S 0 4094 4031 0 95 15 - 1820 hrtime pts/1 00:00:00 sleep
[root@mr ~]#
[root@mr ~]# renice -20 1202
renice: failed to get priority for 1202 (process ID): No such process
[root@mr ~]# ps -elf | grep sleep
0 S root 4094 4031 0 95 15 - 1820 hrtime 22:06 pts/1 00:00:00 sleep 2000
0 S root 4126 4070 0 80 0 - 3027 - 22:29 pts/2 00:00:00 grep --color=auto sleep
[root@mr ~]#
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps(process state)命令用于列出当前的进程。可以显示详细的进程信息,包括:
ps支持三种选项格式:
-e //显示所有进程,与-A效果相同
-l //以长格式显示
-F //显示更详细的完整格式的进程信息
-f //显示更详细的完整格式的进程信息
-H //以进程层级格式显示进程相关信息
-o //根据自己的需要选择要显示的字段
[root@localhost ~]# ps -o pid,comm,ni //表示只显示进程号,命令,nice值三个字段
PID COMMAND NI
8828 bash 0
9844 ps 0
//aux结果解析:
VSZ //Virtual memory SiZe,虚拟内存集
RSS //ReSident Size,常驻内存集
STAT //进程状态
TIME //运行时的累积时长
//ps命令结果解析:
NI //nice值
PRI //优先级
PSR //进程运行在哪个CPU核心上
RTPTRIO //实时优先级
C //运行的CPU编号
STIME //进程的启动时间
VSZ //Virtual memory SiZe,虚拟内存集
RSS //ReSident Size,常驻内存集
STAT //进程状态
TIME //运行时的累积时长
安装pstree
[root@mr ~]# dnf -y install psmisc
Last metadata expiration check: 1:29:24 ago on Wed 06 Jul 2022 09:09:28 PM CST.
Dependencies resolved.
==========================================================================================================================
Package Architecture Version Repository Size
==========================================================================================================================
Installing:
psmisc x86_64 23.1-5.el8 baseos 151 k
Transaction Summary
==========================================================================================================================
Install 1 Package
Total download size: 151 k
Installed size: 483 k
Downloading Packages:
psmisc-23.1-5.el8.x86_64.rpm 62 kB/s | 151 kB 00:02
--------------------------------------------------------------------------------------------------------------------------
Total 50 kB/s | 151 kB 00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : psmisc-23.1-5.el8.x86_64 1/1
Running scriptlet: psmisc-23.1-5.el8.x86_64 1/1
Verifying : psmisc-23.1-5.el8.x86_64 1/1
Installed products updated.
Installed:
psmisc-23.1-5.el8.x86_64
Complete!
[root@mr ~]#
pstree用于显示当前系统上的进程树
[root@mr ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance───{irqbalance}
├─login───bash
├─polkitd───7*[{polkitd}]
├─rhsmcertd
├─rngd───{rngd}
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───sshd───bash
│ └─sshd───sshd───bash───pstree
├─sssd─┬─sssd_be
│ └─sssd_nss
├─systemd───(sd-pam)
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───3*[{tuned}]
└─vmtoolsd───2*[{vmtoolsd}]
[root@mr ~]#
以grep风格指定只显示哪些进程,在当前系统中找符合某些特性的进程。只显示进程号
[root@mr ~]# vi sleep
[root@mr ~]# sleep 5000
[root@mr ~]# ps -ef | grep sleep
root 4488 4031 0 22:43 pts/1 00:00:00 sleep 5000
root 4489 4467 0 22:43 pts/0 00:00:00 vi sleep
root 4491 4070 0 22:43 pts/2 00:00:00 grep --color=auto sleep
[root@mr ~]# pgrep sleep
4488
[root@mr ~]# pidof sleep
4488
[root@mr ~]#
虚拟内存状态查看命令//语法:vmstat [options] [delay [count]]//例:
vmstat 2 //表示每2秒刷新一次
vmstat 2 5 //表示每2秒刷新一次,刷新5次后退出
//常用的选项:
-s //显示内存的统计数据
[root@mr ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1154568 3164 500936 0 0 1 2 19 33 0 0 100 0 0
[root@mr ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1154576 3164 500976 0 0 1 2 19 33 0 0 100 0 0
0 0 0 1154568 3164 500976 0 0 0 0 68 125 0 0 100 0 0
^C
[root@mr ~]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1154576 3164 500976 0 0 1 2 19 33 0 0 100 0 0
2 0 0 1154560 3164 500976 0 0 0 0 67 123 0 0 100 0 0
0 0 0 1154552 3164 500976 0 0 0 0 83 135 0 0 100 0 0
[root@mr ~]#
procs:
r(running) //表示等待运行的队列长度,也即等待运行的进程的个数
b(block) //表示阻塞队列长度,也即处于不可中断睡眠态的进程个数
memory:
swpd //交换内存的使用总量
free //空闲物理内存总量
buffer //用于buffer的内存总量
cache //用于cache的内存总量
swap:
si(swap in) //表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
so(swap out) //表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
io:
bi(block in) //表示磁盘块有多少个被调入内存中,也即从块设备读入数据到系统的速率(kb/s)
bo(block out) //表示有多少个磁盘块从内存中被同步到硬盘上去了,也即保存数据至块设备的速率(kb/s)
system:
in( interrupts) //表示中断的个数,也即中断速率(kb/s)
cs(context switch) //表示上下文切换的次数,也即进程切换速率(kb/s)
CPU:
us //表示用户空间
sy //表示内核空间
id //表示空闲百分比
wa //表示等待IO完成所占据的时间百分比
st //表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)
作业控制是shell的一种功能,它允许单个shell实例运行和管理多个命令。
作业与在shell提示符中输入的每个管道相关联。该管道中的所有进程均是作业的一部分,并且是同一个进程组的成员。(如果在shell提示符中仅输入了一条命令,则这条命令可视为命令的最小管道。该命令将是该作业的唯一成员)
[root@mr ~]# ps -ef | grep sleep
root 4488 4031 0 22:43 pts/1 00:00:00 sleep 5000
root 4489 4467 0 22:43 pts/0 00:00:00 vi sleep
root 4491 4070 0 22:43 pts/2 00:00:00 grep --color=auto sleep
一次只能有一个作业从特定终端窗口读取输入和键盘生成的信号。属于该作业的进程是该控制终端的前台进程。
该控制终端的后台进程是与该终端相关联的任何其他作业的成员。终端的后台进程无法从终端读取输入或接收键盘生成的中断,但可以写入终端。后台中的作业可能已停止(暂停),也可能正在运行。如果某个正在运行的后台作业尝试从终端读取内容,则该作业将自动暂停。
每个终端是其自身的会话,并且可以具有一个前台进程和多个独立的后台进程。一个作业只能属于一个会话,也就是属于其控制终端的会话。
[root@mr ~]# sleep 5000
^Z
[1]+ Stopped sleep 5000
[root@mr ~]# jobs
[1]+ Stopped sleep 5000
[root@mr ~]#
Linux作业分为前台作业与后台作业两种。其各自的特点如下:
[root@mr ~]# sleep 6000 &
[1] 4540
[root@mr ~]# jobs
[1]+ Running sleep 6000 &
[root@mr ~]# ps -ef|grep sleeps
root 4488 4031 0 23:08 pts/1 00:00:00 sleep 6000
root 4542 4031 0 23:09 pts/1 00:00:00 grep --color=auto sleeps
断开终端
[root@mr ~]# ps -ef|grep sleeps
root 4542 4031 0 23:09 pts/1 00:00:00 grep --color=auto sleeps
[root@mr ~]#
//在命令后跟上&符号可以生成一个后台作业
[root@localhost ~]# sleep 1000 &
[1] 1819
//jobs命令用于显示当前所有的后台作业
[root@localhost ~]# jobs
[1]+ Running sleep 1000 &
//fg命令用于将后台作业调至前台运行
[root@localhost ~]# fg
//当只有一个后台作业时,直接使用fg命令,不跟任何参数即可将后台作业调至前台运行,但是当有多个作业时则必须跟上%+作业号,也就是上面命令执行结果中以[]括起来的数字。
[root@mr ~]# sleep 6000 &
[1] 4540
[root@mr ~]# jobs
[1]+ Running sleep 6000 &
[root@mr ~]# ps -ef|grep sleeps
root 4542 4031 0 23:09 pts/1 00:00:00 grep --color=auto sleeps
[root@mr ~]# nohup sleep 600 &
[2] 4547
[root@mr ~]# nohup: ignoring input and appending output to 'nohup.out'
[root@mr ~]# ls
123 abc hehe nohup.out sleep xixi
[root@mr ~]# jobs
[1]- Running sleep 6000 &
[2]+ Running nohup sleep 600 &
[root@mr ~]# ps -ef |grep sleep
root 4540 4031 0 23:08 pts/1 00:00:00 sleep 6000
root 4550 4031 0 23:15 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]# ps -ef |grep sleep
root 4540 4031 0 23:08 pts/1 00:00:00 sleep 6000
root 4554 4031 0 23:15 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]#
//使用ctrl+z可将前台进程发送到后台,此时作业将处于停止状态
//使用bg命令+作业号可使后台已停止的作业重新运行
//kill加上作业号可以手动杀死指定作业
[root@mr ~]# sleep 8000 &
[3] 4555
[root@mr ~]# fg
sleep 8000
^Z
[3]+ Stopped sleep 8000
[root@mr ~]# jobs
[1]+ Stopped sleep 8000
[root@mr ~]# bg %1
[1]+ sleep 8000 &
[root@mr ~]# jobs
[1]+ Stopped sleep 8000
[root@mr ~]# kill %1
[root@mr ~]# jobs
//jobs命令的结果中
+ //命令将默认操作的作业
- //命令将第二个默认操作的作业
进程间通信(IPC:Inter Process Communication)
进程间通信方式:
信号是传递至进程的软件中断。信号向执行中的程序报告事件。生成信号的事件可以是错误或外部事件(如I/O请求或计时器过期),或者来自于明确请求(如使用信号发送命令)
[root@mr ~]# 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
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[2]- Done nohup sleep 600
[root@mr ~]#
下表列出了系统管理员用于日常进程管理的基本信号。请通过短名称(HUP)或正确名称(SIGHUP)指代信号。
| 信号编号ID | 短名称 | 定义 | 用途 |
|---|---|---|---|
| 1 | HUP | 挂起 | 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 |
| 2 | INT | 键盘中断 | 中断一个前台进程。ctrl+c就是用的SIGINT信号 |
| 9 | KILL | 中断,无法拦截 | 导致立即终止程序。无法被拦截、忽略或处理 |
| 15默认值 | TERM | 终止 | 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理 |
用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。kill命令根据ID向进程发送信号。虽其名称为kill,但该命令可用于发送任何信号,而不仅仅是终止程序的信号
//语法: kill [-SIGNAL] PID ...
[root@mr ~]# jobs
[root@mr ~]# sleep 600 &
[1] 4567
[root@mr ~]# sleep 800 &
[2] 4568
[root@mr ~]# sleep 900 &
[3] 4569
[root@mr ~]# ps -ef | grep sleep
root 4567 4031 0 23:31 pts/1 00:00:00 sleep 600
root 4568 4031 0 23:32 pts/1 00:00:00 sleep 800
root 4569 4031 0 23:32 pts/1 00:00:00 sleep 900
root 4571 4031 0 23:32 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]# kill -9 4567
[root@mr ~]# ps -ef | grep sleep
root 4568 4031 0 23:32 pts/1 00:00:00 sleep 800
root 4569 4031 0 23:32 pts/1 00:00:00 sleep 900
root 4583 4031 0 23:37 pts/1 00:00:00 grep --color=auto sleep
[1] Killed sleep 600
[root@mr ~]# killall sleep
[2]- Terminated sleep 800
[3]+ Terminated sleep 900
[root@mr ~]# ps -ef | grep sleep
root 4586 4031 0 23:39 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]#
[root@mr ~]# sleep 500 &
[1] 4587
[root@mr ~]# sleep 5000 &
[2] 4588
[root@mr ~]# ps -ef | grep sleep
root 4587 4031 0 23:40 pts/1 00:00:00 sleep 500
root 4588 4031 0 23:40 pts/1 00:00:00 sleep 5000
root 4591 4031 0 23:41 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]# pkill sleep
[1]- Terminated sleep 500
[2]+ Terminated sleep 5000
[root@mr ~]# ps -ef | grep sleep
root 4594 4031 0 23:42 pts/1 00:00:00 grep --color=auto sleep
[root@mr ~]#
//显示所有可用的信号(可使用man 7 signal查看帮助信息)
//killall COMMAND:killall后面跟进程名,表示将匹配到的以进程名为名的进程全部杀死
负载平均值代表一段时间内感知的系统负载。Linux通过预期服务等待时间的表示来实施平均负载计算。Linux不仅计算进程数,也作为独立的任务计算线程数。运行中线程和等待I/O资源的线程的CPU请求队列对应于R和D进程状态。等待I/O包括处于睡眠而等待预期磁盘和网络响应的任务。负载数属于全局计数器计算,是所有CPU的总和数。由于从睡眠返回的任务可能会重新调度到不同的CPU,难以精确的每CPU计数,但累计数的准确度可以保障。显示的平均负载代表所有的CPU。//查看cpu核心数
[root@mr ~]# grep 'model name' /proc/cpuinfo
model name : Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
model name : Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
model name : Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
model name : Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
[root@mr ~]#
i5-3210M CPU @ 2.50GHz一些UNIX系统仅考虑CPU使用率或运行队列长度来指示系统负载。由于具有空闲CPU的系统可能会因为磁盘或网络资源忙而遇到很长时间的等待,因此Linux负载平均值中包含了对I/O的考量。遇到负载平均值很高但CPU活动很低时,请检查磁盘和网络活动。Linux中可以使用top、uptime显示负载平均值的情况。
[root@mr ~]# uptime
23:56:15 up 1 day, 6:59, 2 users, load average: 0.00, 0.00, 0.00
[root@mr ~]#
//此处的load average就表示负载平均值,这三个值代表最近1、5和15分钟的负载情况。将显示的负载平均值除以系统中的逻辑CPU数。当值低于1表示资源利用率较好,等待时间很短。当值高于1表示资源饱和,而且有一定的服务等待时间。空闲CPU队列的负载数为0。每个就绪和等待的线程使计数增加1。总队列数为1时,资源(CPU、磁盘或网络)正在使用中,但没有请求把时间花在等待上。增加的请求数会累积该计数,但由于许多请求可以在时限内处理,资源使用率会很高,而等待时间则不会。因为磁盘或网络资源忙碌等待I/O而处于睡眠的进程包含在该计数内,而且使负载平均值增大。虽然不能表示CPU使用率,队列数依然表明用户和程序正在等待资源服务。在资源饱和前,平均负载将保持在1以下,因为几乎不会在队列中发现等待的任务。只有资源饱和导致请求留在排队状态并且被负载计算例程计数时,负载平均才会增大。当资源使用率接近100%时,每个增加的请求将开始遭遇服务等待时间。
top用于实现全屏动态显示系统信息//常用选项:
-d //设置延迟时长,top -d 1表示每隔1秒刷新一次,默认每隔5秒刷新
-b //批模式翻屏显示,默认只实时显示一屏,若要显示后面的进程信息则可使用-b选项,与-n #合用,可指定显示翻#屏
[root@mr ~]# top -b -n 1
top - 00:01:22 up 1 day, 7:04, 2 users, load average: 0.01, 0.00, 0.00
Tasks: 157 total, 1 running, 156 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 1.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1948.9 total, 1136.5 free, 320.4 used, 492.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1428.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4581 root 20 0 0 0 0 I 6.2 0.0 0:01.32 kworker/3:2-events
1 root 20 0 244948 13852 8796 S 0.0 0.7 0:04.26 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.04 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
10 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
11 root 20 0 0 0 0 I 0.0 0.0 1:59.99 rcu_sched
12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
13 root rt 0 0 0 0 S 0.0 0.0 0:00.10 watchdog/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
16 root rt 0 0 0 0 S 0.0 0.0 0:00.09 watchdog/1
17 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
18 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/1
20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-kblockd
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2
22 root rt 0 0 0 0 S 0.0 0.0 0:00.13 watchdog/2
23 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/2
24 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/2
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/2:0H-kblockd
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3
28 root rt 0 0 0 0 S 0.0 0.0 0:00.08 watchdog/3
29 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/3
30 root 20 0 0 0 0 S 0.0 0.0 0:00.21 ksoftirqd/3
32 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/3:0H
34 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
35 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
load average:1分钟,5分钟,15分钟
load average //CPU队列中等待运行的任务的个数
cpu(s):多颗CPU平均负载,按1键显示每颗CPU平均负载。
us //表示用户空间;
sy //表示内核空间;
ni //表示调整nice值,CPU占用的比率;
id //表示空闲百分比;
wa //表示等待IO完成所占据的时间百分比;
hi //表示hard interrupt,硬件中断占据的时间百分比;
si //表示软中断占据的时间百分比;
st //表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)
PR //优先级
NI //nice值
VIRT //虚拟内存集
RES //常驻内存集
SHR //共享内存大小
S //进程状态
//top命令交互式子命令:
M //根据驻留内存大小进行排序,默认根据CPU百分比排序
P //根据CPU使用百分比进行排序
T //根据累计时间(占据CPU时长)进行排序
l //是否显示平均负载和启动时间
t //是否显示进程和CPU状态相关信息
m //是否显示内存相关信息
c //是否显示完整的命令行信息
q //退出top命令
k //终止某个进程
1 //显示所有CPU的信息
s //修改刷新时间间隔
写出以下描述对应的进程状态标志:
| 描述 | 状态标志 |
|---|---|
| 进程已被停止(暂停) | |
| 进程已释放了其所有资源(pid除外) | |
| 进程正在CPU上运行或者正在等待于CPU上运行 | |
| 进程正处于睡眠状态,直至满足某些条件后才会启动 | |
| 进程正在等待I/O或某些条件得到满足,并且绝对不会影响信号 | |
| 按以下顺序练习后台与前台进程操作: |
[root@mr ~]# (while true;do echo -n 'rock ' >> ~/outfile;sleep 1;done)
[root@mr ~]# tail -f ~/outfile
rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock
[root@mr ~]# (while true;do echo -n 'rock ' >> ~/outfile;sleep 1;done)
^Z
[1]+ Stopped ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[root@mr ~]#
右窗口
[root@mr ~]# tail -f ~/outfile
rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock
[root@mr ~]# jobs
[1]+ Stopped ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[root@mr ~]# bg %1
[1]+ ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]# jobs
[1]+ Running ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]#
右窗口
[root@mr ~]# tail -f ~/outfile
rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock
[root@mr ~]# (while true;do echo -n 'paper ' >> ~/outfile;sleep 1;done) &
[2] 4929
[root@mr ~]# (while true;do echo -n 'scissors ' >> ~/outfile;sleep 1;done) &
[3] 4955
[root@mr ~]#
[root@mr ~]# jobs
[1] Running ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[2]- Running ( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done ) &
[3]+ Running ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]#
右窗口
[root@mr ~]# tail -f ~/outfile
rock rock rock rock rock rock rock rock rock rock rock paper rock paper paper rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper
[root@mr ~]# fg %1
( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[root@mr ~]# jobs
[1]+ Stopped ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[2] Running ( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done ) &
[3]- Running ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]#
[root@mr ~]# tail -f ~/outfile
paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper
[root@mr ~]# fg %2
( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done )
^C
[root@mr ~]# jobs
[3]+ Running ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]#
[root@mr ~]# tail -f ~/outfile
paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper scissors rock paper
[root@mr ~]# ps j
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1035 1266 1266 1266 tty1 1266 Ss+ 0 0:00 -bash
4030 4031 4031 4031 pts/1 6180 Ss 0 0:00 -bash
4640 4641 4641 4641 pts/0 4641 Ss+ 0 0:00 -bash
4641 4859 4859 4641 pts/0 4641 T 0 0:00 tail -f /root/outfile
4031 4955 4955 4031 pts/1 6180 S 0 0:00 -bash
4641 5259 5259 4641 pts/0 4641 T 0 0:00 tail -f /root/outfile
4641 5800 5800 4641 pts/0 4641 T 0 0:00 tail -f /root/outfile
4955 6179 4955 4031 pts/1 6180 S 0 0:00 sleep 1
4031 6180 6180 4031 pts/1 6180 R+ 0 0:00 ps j
[root@mr ~]#
[root@mr ~]# jobs
[1]+ Stopped ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[3]- Running ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]# bg %1
[1]+ ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[root@mr ~]# fg %1
( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
^C
[root@mr ~]# fg %3
( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done )
^C
[root@mr ~]#
paper scissors rock paper scissors paper scissors paper scissors paper scissors paper scissors paper scissors paper scissors paper scissors ^C
[root@mr ~]#
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
我想从rubyrake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调