首页 > 代码库 > linux基础学习第十八天之进程管理和任务计划
linux基础学习第十八天之进程管理和任务计划
内容:
进程相关概念(用户空间、内核空间,进程、线程)
进程及系统相关工具(ps、top、pgrep、pidof、kill)
调整nice值(nice、renice)
作业管理(jobs、fg、bg、kill,&)
计划任务(at、crontab)
一、进程相关概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
内核空间和用户空间关系:
对计算机来说,其实只有CPU和内存,其中在某一时刻内存逻辑上分为两部分(linux系统):用户空间和内核空间,每一个用户进程在内存的用户空间进行运行,当用户进程需要进行硬件资源的访问和使用时
此时会通过系统调用到内核空间,因为只有内核才有权限进行硬件的访问,此时未运行完的进程会暂时中止(保留现场),CPU进而处理内核相关请求,而中止的进程相关状态信息保存在内核task struct(Linux内核存储进程信息的数据结构格式),即相当于内核会建立一个的运行的
程序的数据库,当内核硬件的请求CPU处理完毕,内核会根据记录进程数据库中读取进程的状态(恢复现场),从而知道程序运行到哪一步,进而继续运行下去,而不需要重新运行进程
因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。
进程和线程的关系:
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
(1)进程创建:
init:第一个进程
父子关系
进程:都由其父进程创建,COW
fork(), clone()
任何一个进程都是init的子进程
[11:08 root@Centos6.8~]# pstree init─┬─S80cmd───curl ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}] ├─bonobo-activati───{bonobo-activat} ├─certmonger ├─clock-applet ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─cupsd ├─2*[dbus-daemon───{dbus-daemon}] ├─2*[dbus-launch] ├─devkit-power-da ├─dhclient ├─gconf-im-settin ├─gconfd-2 ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg───2*[{Xorg}] │ │ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet │ │ │ │ ├─bluetooth-apple │ │ │ │ ├─evolution-alarm │ │ │ │ ├─gdu-notificatio │ │ │ │ ├─gnome-panel │ │ │ │ ├─gnome-power-man │ │ │ │ ├─gnome-volume-co │ │ │ │ ├─gpk-update-icon │ │ │ │ ├─metacity───{metacity} │ │ │ │ ├─nautilus │ │ │ │ ├─nm-applet │ │ │ │ ├─polkit-gnome-au │ │ │ │ ├─python │ │ │ │ ├─restorecond │ │ │ │ └─{gnome-session} │ │ │ └─{gdm-session-wo} │ │ └─{gdm-simple-sla} │ └─{gdm-binary} ├─gdm-user-switch ├─gnome-keyring-d───2*[{gnome-keyring-}] ├─gnome-screensav ├─gnome-settings-───{gnome-settings} ├─gnome-terminal─┬─bash │ ├─gnome-pty-helpe │ └─{gnome-terminal} ├─gnote ├─gvfs-afc-volume───{gvfs-afc-volum} ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}] ├─gvfs-gdu-volume ├─gvfs-gphoto2-vo ├─gvfsd ├─gvfsd-burn ├─gvfsd-metadata ├─gvfsd-trash ├─hald─┬─hald-runner─┬─hald-addon-acpi │ │ ├─hald-addon-inpu │ │ └─hald-addon-stor │ └─{hald} ├─im-settings-dae ├─irqbalance ├─5*[mingetty] ├─notification-ar ├─pcscd───{pcscd} ├─polkitd ├─pulseaudio─┬─gconf-helper │ └─2*[{pulseaudio}] ├─rpc.statd ├─rpcbind ├─rsyslogd───3*[{rsyslogd}] ├─rtkit-daemon───2*[{rtkit-daemon}] ├─seahorse-daemon ├─sshd───sshd───bash───pstree ├─trashapplet ├─udevd───2*[udevd] ├─udisks-daemon─┬─udisks-daemon │ └─{udisks-daemon} └─wnck-applet
(2)进程状态:
运行态:running【一个CPU一个时间只能运算一个进程,即同一时间只有一个进程是运行状态】
就绪态:ready
睡眠态:进程所需要的资源没有被正常获取或者正在等待资源的获取时,就会进入睡眠状态
可中断:interruptable(如ctrl+c能使进程中断的就是可中断的睡眠)
不可中断:uninterruptable(在运行的过程中不能中断,即不能kill)
停止态:stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
(3进程优先级:
优先级高代表:
1、获得更多的CPU时间
2、更优先获得运行的机会
系统优先级:数字越小,优先级越高
0-139(CentOS4,5)
各有140个运行队列和过期队列
0-98,99(CenOS6)
实时优先级:99-0:值最大优先级最高
Nice值:-20,19对应系统优先级100-139或99
1、普通用户只能调大自己进程的nice值
2、root可以调大调小nice
时间复杂度:Big O,用时和规模的关系(横坐标可以是规模或者队列数列,纵坐标是时间)
O(1):
O(logn),
O(n)线性,
O(n^2)抛物线,
O(2^n)
(4)进程编号:
PID:process ID
每一进程的PID都是唯一的,就算进程结束,一般其他程序都不会占用此号码,所以会看到中间有些数字没有连续,代表有些进程产生并且已经结束
任何一个进程都是init的子进程,所以init的PID永远是1
/proc下每个文件夹名为数字的都代表一个进程的编号PID
[14:22 root@Centos6.8~]# ls /proc/ 1 14 1692 2 22 30 3758 3892 3935 4122 4785 64 cmdline irq mounts swaps 10 1426 17 20 2220 31 38 3894 3936 4124 4789 65 cpuinfo kallsyms mpt sys 11 1460 1700 2007 2231 32 3829 39 3941 4156 48 66 crypto kcore mtd sysrq-trigger 1123 1494 1727 2012 2239 33 3842 3904 3942 4163 49 7 devices keys mtrr sysvipc 1124 15 1745 2014 23 34 3847 3905 3945 4194 5 730 diskstats key-users net timer_list 1125 1512 18 2017 24 342 3854 3908 3946 4196 50 8 dma kmsg pagetypeinfo timer_stats 1126 1532 1881 2019 25 343 3856 3910 4 4197 51 9 driver kpagecount partitions tty 1173 1555 1894 2028 26 344 3857 3911 40 42 52 98 execdomains kpageflags sched_debug uptime 12 1599 19 2060 27 35 3862 3912 4008 43 53 99 fb loadavg schedstat version 13 16 1935 2064 28 36 3866 3915 41 444 548 acpi filesystems locks scsi vmallocinfo 132 1632 1949 2087 280 37 3880 3918 4110 445 6 asound fs mdstat self vmstat 13524 1644 1964 21 281 3723 3882 3921 4112 46 60 buddyinfo interrupts meminfo slabinfo zoneinfo 13615 1645 1980 2159 29 3747 3887 3927 4117 47 61 bus iomem misc softirqs 13616 1691 1991 2167 3 3755 3890 3933 4120 4718 62 cgroups ioports modules stat
二、进程常用工具命令:
1、ps:process state
语法:ps [options]
注意:该命令查看的是某一时刻的瞬间进程运行的状态,非连续查看
支持三种选项:
UNIX选项如-a(选项前加-)
BSD选项如a
默认显示当前终端中的进程
a选项包括所有终端中的进程
x选项包括不连接终端的进程(TTY的状态为?的进程)
u选项显示进程所有者的信息
f选项显示进程的父进程
o属性… 选项显示定制的信息:
pid、comm、%cpu、%mem、state、tty、euser、ruser
[14:38 root@Centos6.8/proc/10]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19352 1548 ? Ss 08:46 0:02 /sbin/init root 2 0.0 0.0 0 0 ? S 08:46 0:00 [kthreadd] root 2007 0.0 0.0 4064 544 tty2 Ss+ 08:48 0:00 /sbin/mingetty /dev/tty2 root 2012 0.0 0.0 4064 540 tty3 Ss+ 08:48 0:00 /sbin/mingetty /dev/tty3 root 2014 0.0 0.0 4064 544 tty4 Ss+ 08:48 0:00 /sbin/mingetty /dev/tty4 root 2017 0.0 0.0 4064 540 tty5 Ss+ 08:48 0:00 /sbin/mingetty /dev/tty5 root 2019 0.0 0.0 4064 544 tty6 Ss+ 08:48 0:00 /sbin/mingetty /dev/tty6 root 2028 0.0 0.1 12640 2876 ? S< 08:48 0:00 /sbin/udevd -d root 2060 0.0 0.1 164924 3564 ? Sl 08:48 0:00 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager root 2064 0.0 1.5 196384 29084 tty1 Ssl+ 08:48 0:04 /usr/bin/Xorg :0 -br -verbose -audit 4 -auth /var/run/gdm/auth-for-g root 2087 0.0 0.1 1036464 3360 ? Sl 08:48 0:00 /usr/sbin/console-kit-daemon --no-daemon gdm 2159 0.0 0.0 20044 696 ? S 08:48 0:00 /usr/bin/dbus-launch --exit-with-session
USER:发起进程的用户 PID:PID号 %CPU:使用CPU百分比 %MEM:使用内存百分比 VSZ:Virtual memory SiZe,虚拟内存集,线性内存 RSS:ReSidentSize, 常驻内存集 TTY:和终端相关 STAT:进程状态 D:不可中断睡眠 S:可中断的睡眠 R:就绪或运行状态 T:中止状态 Z:僵死状态 <:高优先级进程 N:低优先级进程 +:前台进程组中的进程 l:多线程的进程 s:会话进程的首进程 START:进程开始时间 TIME:进程真正在CPU运行的时间,而非挂表时长 COMMANDD:发起进程的命令,【如果命令中有中括号,代表是内核进程】
2、top:可查看动态的进程情况
top - 16:02:39 up 7:15, 3 users, load average: 0.15, 0.25, 0.39 Tasks: 163 total, 1 running, 162 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.7%sy, 0.0%ni, 99.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1907300k total, 683656k used, 1223644k free, 81328k buffers Swap: 4095996k total, 0k used, 4095996k free, 249180k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3 root RT 0 0 0 0 S 0.3 0.0 0:00.69 migration/0 1894 root 20 0 105m 972 580 S 0.3 0.1 0:08.28 S80cmd 3910 root 20 0 227m 2052 1704 S 0.3 0.1 0:01.80 gvfs-afc-volume 17909 root 20 0 15032 1264 936 R 0.3 0.1 0:00.12 top 1 root 20 0 19352 1548 1232 S 0.0 0.1 0:02.02 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd 4 root 20 0 0 0 0 S 0.0 0.0 0:00.08 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
[16:03 root@Centos6.8/proc/10]# uptime 16:03:38 up 7:16, 3 users, load average: 0.25, 0.25, 0.38
top命令说明: 第一行:是uptime信息,其中load average:N,M,K:N,M,K代表过去1,5,15分钟CPU负载情况, 如果这个数除以CPU的数目,结果高于5的时候就表明系统在超负荷运转了,正常应该控制在小于1的范围内,通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。 第三行:CPU的运算占用比 us(user):用户空间的进程 sy(system):内核空间 ni(nice):调整nice的时间 id(idle):空闲 wa(wait):等待IO时间 hi(hardinterrupt):硬中断 si(softinterrupt):软中断 st(stool):虚拟机偷走的时间 第四行:物理内存使用情况 第五行:虚拟内存使用情况 交互命令: M: 根据驻留内存大小进行排序 P:根据CPU使用百分比进行排序 T: 根据累计时间进行排序 l: 是否显示平均负载和启动时间 t: 是否显示进程和CPU状态相关信息 m: 是否显示内存相关信息 c: 是否显示完整的命令行信息 q: 退出top k: 终止某个进程
3、进程搜索:pgrep、pidof
pgrep:查找摸个进程的ID号
pgrep[options] patter
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示父进程为此处指定的进程的进程列表
[15:34 root@Centos6.8/proc/10]# pgrep -u root ssh 1881 4785
pidof:根据程序名查找相关的PID
pidof [-s] [-c] [-x] [-m] [-o omitpid] [-o omitpid..] program [program..]
[15:37 root@Centos6.8/proc/10]# pidof bash 4197
4、kill
kill:向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:kill -l
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
9) SIGKILL: 杀死正在运行的进程(强制立刻杀死进程)
15) SIGTERM:终止正在运行的进程(可能不会立即生效,会等进程保存完所有数据才正常退出)
18) SIGCONT:
19) SIGSTOP:
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
[17:03 root@Centos6.8/proc/10]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1 11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM 16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP 21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR 31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8 43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12 53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2 63) SIGRTMAX-164) SIGRTMAX
5、killall:kill单次只能杀死一个进程PID,当一个服务开启多个进程,而要结束该服务时,可使用killall杀死该服务即可
killall:kill processes by name
kill [options] name
三、调整nice优先级
nice:-20到19,值越小优先级越高
1、调整已经启动的进程nice值
renice NI PID
[17:28 root@Centos6.8/proc/10]# pgrep bash 4197 4789 [17:28 root@Centos6.8/proc/10]# renice 3 4789 4789: old priority 0, new priority 3 [17:28 root@Centos6.8/proc/10]# renice -3 4789 4789: old priority 3, new priority -3
2、调整未启动的进程nice优先级:
nice -n NI COMMAND
[17:32 root@Centos6.8/proc/10]# nice -n -3 date Tue Sep 6 17:32:09 CST 2016
四、作业管理
(1)Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业:Ctrl+z(进程会处于暂停状态)
(2) 尚未启动的作业:COMMAND &
此类后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业.
查看所有作业:
jobs:作业号不是进程号
+:命令将默认操作的作业
—:命令将第二个默认操作的作业
[18:37 root@Centos6.8/proc/10]# ping 10.1.0.1 PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data. 64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=0.477 ms ^Z [1]+ Stopped ping 10.1.0.1
(2)作业控制:
fg %JOB_NUM:把指定的后台作业调回前台;
bg %JOB_NUM:让送往后台的作业在后台继续运行;
kill %JOB_NUM:终止指定的作业;
[18:32 root@Centos6.8/proc/10]# ping 10.1.0.1 PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data. 64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=0.365 ms 64 bytes from 10.1.0.1: icmp_seq=2 ttl=64 time=0.731 ms ^Z [1]+ Stopped ping 10.1.0.1 [18:33 root@Centos6.8/proc/10]# fg %1 ping 10.1.0.1 64 bytes from 10.1.0.1: icmp_seq=3 ttl=64 time=0.972 ms 64 bytes from 10.1.0.1: icmp_seq=4 ttl=64 time=1.96 ms 64 bytes from 10.1.0.1: icmp_seq=5 ttl=64 time=1.73 ms 64 bytes from 10.1.0.1: icmp_seq=6 ttl=64 time=1.08 ms ^Z [1]+ Stopped ping 10.1.0.1 [18:34 root@Centos6.8/proc/10]# jobs [1]+ Stopped ping 10.1.0.1 [18:34 root@Centos6.8/proc/10]# kill %1 [1]+ Stopped ping 10.1.0.1
(3)程序并行运行
1、使用脚本,每个子命令后加&
vi 4.sh
1.sh&
2.sh&
3.sh&
[18:58 root@Centos6.8~]# paste -d% 1.sh 2.sh 3.sh #!/bin/bash%#!/bin/bash%#!/bin/bash while true%while true%while true do%do%do echo "1"%echo "2"%echo "3" sleep 1%sleep 2%sleep 3 done%done%done [18:58 root@Centos6.8~]# 3 2 1 1 2 1 3 1 2 1 1 3 2 1
2、使用小括号
( (f1.sh&);(f2.sh&);(f3.sh&)) [19:00 root@Centos6.8~]# ((/root/1.sh&);(/root/2.sh&);(/root/3.sh&)) [19:00 root@Centos6.8~]# 1 2 3 1 2 1 3 1 2 1
3、使用大括号
{ f1.sh& f2.sh& f3.sh& }
五、计划任务
1、在未来的某个时间点执行一次某任务;
at
at 时间
at> COMMAND
at> Ctrl+d(提交命令)
指定时间:
绝对时间:HH:MM, DD.MM.YY MM/DD/YY
相对时间:now+#
单位:minutes, hours, days, weeks
模糊时间:noon, midnight, teatime
常用选项:
-q QUEUE:
-l: 列出指定队列中等待运行的作业;相当于atq
-d JOB_ID: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:强制at发送邮件,表示执行完毕
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
at允许或禁止某用户的配置文件:
/etc/at.deny,/etc/at.allow
其中,如果只有/etc/at.deny,表示出了deny名单外的人都可以使用at,默认deny名单为空,表示所有人都可以使用
如果只有/etc/at.allow,表示只有名单的用户才能使用at
如果两个文件都存在,一般来说只有allow生效
如果两个文件都没有,则表示只有root才能使用at
2、周期性地执行某任务;
cron:自身是一个不间断运行的服务,注意,当因关机等意外情况而是任务超时没有执行,恢复服务后,默认也不会再回头执行过时的任务
anacron: cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;
注意,使用cron时先要查看系统的crond服务是否已经启动:
[19:42 root@Centos6.8~]# service crond status crond (pid 1949) is running...
cron:
(1)系统cron任务:
/etc/crontab
分钟 小时 天 月 周 用户 任务
用户cron任务:
/var/spool/cron/USERNAME
分钟 小时 天 月 周 任务
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
(2)时间的有效取值:
分钟:0-59
小时:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
(3)时间通配表示:
*: 对应时间的所有有效取值
3 * * * * :每小时的第三分钟
3 * * * 7:每周天的每小时的第三分钟
13 12 6 7 *:每年7月的6号的12点13分钟
,: 离散时间点:
10,40 02 * * 2,5 :每周二凌晨2点10分、2点40分和每周五凌晨2点10分、2点40分
-:连续时间点:
10 02 * * 1-5:周一到周五的凌晨2点10分
/#: 对应取值范围内每多久一次,#代表频率
*/3 * * * *:每3分钟
每两小时执行一次:一定要在比小时更小的单位给一个具体数值
08 */2 * * *
每两天执行一次:一定要在比天更小的单位给一个具体数值
10 04 */2 * *
(4)执行结果将以邮件形式发送给管理员:
*/3 * * * * /bin/cat /etc/fstab &> /dev/null
(5)注意:
1)cron的环境变量:cron执行所有命令都去PATH环境变量指定的路径下去找,所以为避免某些命令不再PATH变量中,建议命令使用绝对路径表示
cron默认搜索的PATH /bin:/sbin:/usr/bin:/usr/sbin
如果运行的是脚本,要注意在脚本的开头先声明PATH:export PATH=
2)对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
用户任务的管理:
crontab
-l: 列出当前用户的所有cron任务
-e: 编辑创建周期任务
-r: 移除所有任务
-u USERNAME: 管理其用户的cron任务
eg. crontab -eu USERNAME
本文出自 “6638225” 博客,转载请与作者联系!
linux基础学习第十八天之进程管理和任务计划