rrain7 / 2021Records

缅怀一下荒废的上半年
0 stars 0 forks source link

Linux学习 #7

Open rrain7 opened 3 years ago

rrain7 commented 3 years ago

Linux 系统管理

进程管理

进程是当前在系统上运行的编译过的源代码。 每个进程都有一个进程id,也称PID 每一个进程都有一个父进程「PPID」,子进程通常由父进程启动 init进程 PID=1,它是由内核启动,所以它没有父进程,它充当僵尸进程的父进程。 「守护进程」随系统启动而启动,并且永远保持运行

$$ 会保留你当前的进程 ID 。 $PPID 将会显示父进程 ID 可以使用pidof命令按名称找到所有进程的ID。

pidof mingetty

fork && exec 一个进程启动另一个进程分为两个阶段。首先,该进程创建一个自己的分叉(fork),即一个相同的副本。然后被分叉的进程执行一个执行(exec)程序,用目标子进程替换被分叉的进程。

exec

> echo $$
10
> sh # 子进程

> echo $$ $PPID
1572 10
> exec bash

> echo $$ $PPID
1572 10

ps Linux上最常用的查看进程的工具之一是ps。下面显示了三个bash进程之间的父子关系。

> echo $$ $PPID
1577 0
> bash
> echo $$ $PPID
1603 1577
> bash
> echo $$ $PPID
1606 1603
> ps fx
PID TTY      STAT   TIME COMMAND
 1577 pts/1    Ss     0:00 /bin/bash
 1603 pts/1    S      0:00  \_ bash
 1606 pts/1    S      0:00      \_ bash
 1609 pts/1    R+     0:00          \_ ps fx
    1 pts/0    Ss+    0:00 bash

ps -C类似,你也可以用pgrep按命令名称搜索一个进程。

> sleep 100&
[1] 1616
> pgrep sleep
1616

Linux上另一个流行的工具是toptop工具可以根据cpu使用率或其他属性来排列进程。你也可以从top中杀死进程。在top中按h键获得帮助。

在出现问题时,top通常是第一个启动的工具,因为它也为你提供内存和交换空间信息。

kill命令将会杀死(或者停止)一个进程 通过使用kill,我们向进程发送了一个信号。

> ps fx
PID TTY      STAT   TIME COMMAND
 1577 pts/1    Ss     0:00 /bin/bash
 1603 pts/1    S      0:00  \_ bash
 1606 pts/1    S      0:00      \_ bash
 1621 pts/1    R+     0:00          \_ ps fx
    1 pts/0    Ss+    0:00 bash
> kill 1606
>

运行中的进程可以接收来自对方或用户的信号。你可以通过输入kill -l(即字母l,而不是数字1)来获得一个信号列表。

> 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

在Linux上,通常使用第一个信号SIGHUP(或HUP或1)来告诉一个进程应该重新读取它的配置文件。因此,kill -1 1命令迫使init进程(init总是以pid 1运行)重新读取其配置文件。

kill -15是标准kill, 若不指定,则默认为kill -15

SIGKILL与其他大多数信号不同,它不是发给进程的,而是发给Linux内核的。kill-9也被称为肯定杀死。内核会将进程击落。作为一个开发者,你没有办法拦截kill -9信号。

pkill 可以通过进程名称将进程杀死。

> sleep 100&
> pkill sleep

top命令下, 按k可以选择一个pid进行杀死

进程优先级

所有进程都有一个优先级和一个漂亮的值。高优先级的进程将比低优先级的进程获得更多的cpu时间。你可以用nicerenice命令来影响这一点。

pipes(mkfifo) 进程可以使用管道来进行通信,管道可以使用mkfifo来进行创建。

> take procs
procs> mkfifo pipe33a pipe33b pipe42a pipe42b
procs> ls -l
total 0
prw-r--r-- 1 root root 0 Aug 24 06:06 pipe33a
prw-r--r-- 1 root root 0 Aug 24 06:06 pipe33b
prw-r--r-- 1 root root 0 Aug 24 06:06 pipe42a
prw-r--r-- 1 root root 0 Aug 24 06:06 pipe42b

top -p 67,68,70显示指定pid运行情况

> top -p 67,68,70

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   67 root      20   0    4240    604      0 S   0.0   0.0   0:00.00 bash
   68 root      20   0    4240    616      0 S   0.0   0.0   0:00.00 bash
   70 root      20   0    4240    616      0 S   0.0   0.0   0:00.00 bash

由于进程已经在运行,我们需要使用renice命令来改变其nice值(NI)。

renice +n pid # n = 0 to 20

普通用户可以将n设为[0,20], root用户可以使用负值,使用负的nice值时要非常小心,因为它们可能导致无法使用键盘或ssh到一个系统。

nice值的影响 越不重要的进程的nice值越大,越重要的进程nice值越小。 使用负的nice值会对系统的可用性产生严重影响。

nice的作用与renice相同,但它是在启动命令时使用的。截图显示了如何以5的nice值启动一个脚本。

> nice -5 ./backup.sh