第四周作业

目录

1. 总结脚本高级命令trap, install, mktemp, expect, 进程优先级命令:nice, renice, 进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job, 任务相关的命令: at, crontab, 命令,选项,示例。

脚本高级命令trap, install, mktemp, expect

进程优先级命令:nice, renice

进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job

任务相关的命令: at, crontab

2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。

1)数值索引:

2) 关联索引:索引可支持自定义的格式,不仅仅是数字,bash4.0之后支持

3) 字符串处理:

4) 高级变量使用:

3. 求10个随机数的最大值与最小值。

4. 使用递归调用,完成阶乘算法实现。

3. 解析进程和线程的区别?

4. 解析进程的结构。

一、数据写入进程(DBWn)

二、日志写入进程(LGWR)

三、SMON(System Monitor)

四、PMON(Process Monitor)

五、CKPT(Checkpoint Process)

六、MMON(Manageability Monitor)

七、ARCn(Archiver)

八、RAC相关后台进程

九、ASM相关进程

5. 解析磁盘中的代码如何在计算机上运行的?

6. 总结OOM原理,及处理方法。

7. 结合进程管理命令,说明进程各种状态。

1)管理进程工具:

2)进程各种状态:

8. 说明IPC通信和RPC通信实现的方式。

9. 通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?

10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

11. 总结内核设计流派及特点。

1)内核设计流派:

2)特点:

12. 总结centos 6 启动流程,grub工作流程

1)centos6启动流程:

2)grub工作流程:

13. 手写chkconfig服务脚本,可以实现服务的开始,停止,重启。

14. 总结systemd服务配置文件

15. 总结system启动流程

16. 总结awk工作原理,awk命令,选项,示例。

1)awk工作原理:

2)awk命令:

17. 总结awk的数组,函数。

1)数组:

   2)函数:

18. 总结ca管理相关的工具,根据使用场景总结示例。

19. 总结openssh免密认证原理,及免认证实现过程。


1. 总结脚本高级命令trap, install, mktemp, expect, 进程优先级命令:nice, renice, 进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job, 任务相关的命令: at, crontab, 命令,选项,示例。

脚本高级命令trap, install, mktemp, expect

# trap(捕获信号):避免了错误信号让程序终止的异常
root@Ubuntu:~# trap -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

# 系统发出指令信号时,将执行自定义指令,不执行原操作
trap '触发指令' 信号

# 忽略信号操作
trap '' 信号

# 恢复原信号操作
trap '-' 信号

# 列出自定义信号
trap -p

# 当前脚本退出时,执行finish函数
trap finish EXIT



# install:相当于mkdir、cp、改属性
# 拷贝
install a /opt 

# 只创建目录
install -d 

# 修改权限
install -m 600

# 修改所属主own
install -o 

# 修改所属组
install -g 


# 临时文件的创建(mktemp)
root@Ubuntu:/data# mktemp testXXX
test3Ml
# 创建临时文件夹
root@Ubuntu:/data# mktemp -d testXXXXX
testwrHBc
root@Ubuntu:/data# ll
total 36
drwxr-xr-x  6 root root 4096 Feb  8 10:24 ./
drwxr-xr-x 21 root root 4096 Jan 11 17:56 ../
drwxr-xr-x  2 root root 4096 Dec 23 15:23 a/
-rw-r--r--  1 root root  442 Feb  8 10:05 joke.sh
drwxr-xr-x  2 root root 4096 Dec 21 15:53 mysql/
drwxr-xr-x  2 root root 4096 Jan 14 00:55 scripts/
-rw-------  1 root root    0 Feb  8 10:20 test3Ml
drwx------  2 root root 4096 Feb  8 10:24 testwrHBc/
-rw-r--r--  1 root root  474 Feb  8 10:15 trap_finish.sh
-rw-r--r--  1 root root  597 Feb  8 10:00 trap.sh


# 交互式转化批处理工具(expect)
# 自动登录
#!/usr/bin/expect
spawn ssh 192.168.100.131
expect {
        "yes/no" { send "yes\n";ecp_continue }
        "password" { send "111111\n"}
}
interact #回到交互

进程优先级命令:nice, renice

# nice 命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。
# nice 命令格式如下:
 nice [-n NI值] 命令
-n NI值:给命令赋予 NI 值,该值的范围为 -20~19;



# 同 nice 命令恰恰相反,renice 命令可以在进程运行时修改其 NI 值,从而调整优先级。
# renice 命令格式如下:
renice [优先级] PID
此命令中使用的是进程的 PID 号,因此常与 ps 等命令配合使用。

进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job

# 进程信息(ps)
# 以内存的利用率来倒序排序
root@Ubuntu:~# ps axo pid,cmd,%cpu,%mem --sort -%mem
    PID CMD                         %CPU %MEM
    939 /usr/lib/snapd/snapd         0.0  1.0
    571 /sbin/multipathd -d -s       0.0  0.6
   1008 /usr/bin/python3 /usr/share  0.0  0.5
    932 /usr/bin/python3 /usr/bin/n  0.0  0.4
    946 /usr/libexec/udisks2/udisks  0.0  0.3
    528 /lib/systemd/systemd-journa  0.0  0.3
    913 /lib/systemd/systemd-resolv  0.0  0.3
    818 /usr/bin/VGAuthService       0.0  0.2
      1 /sbin/init                   0.0  0.2
    990 /usr/sbin/ModemManager       0.0  0.2
   1479 sshd: root@pts/0             0.4  0.2
  13711 sshd: root@pts/1             0.0  0.2
   1429 /lib/systemd/systemd --user  0.0  0.2
# 能够显示进程的父子关系
root@Ubuntu:~# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           2  0.0  0.0      0     0 ?        S    13:58   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   13:58   0:00  \_ [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   13:58   0:00  \_ [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   13:58   0:00  \_ [slub_flushwq]
root         981  0.0  0.2  15420  9200 ?        Ss   13:58   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 st
root        1479  0.4  0.2  17444 11380 ?        Ss   14:00   0:29  \_ sshd: root@pts/0
root        1528  0.0  0.1   9176  6068 pts/0    Ss   14:00   0:00  |   \_ -bash
root       39641  0.0  0.0  10404  3752 pts/0    R+   15:48   0:00  |   |   \_ ps auxf
root       35297  0.4  0.0   7368  3656 ?        Ss   15:36   0:03  |   \_ bash -c while [ -d /proc/$PPID ]; do slee
root       39642  0.0  0.0   5768  1012 ?        S    15:48   0:00  |       \_ sleep 1
root       13711  0.0  0.2  17444 11324 ?        Ss   14:35   0:01  \_ sshd: root@pts/1
root       13769  0.0  0.1   8916  5820 pts/1    Ss+  14:35   0:00      \_ -bash
root         990  0.0  0.2 317012 11756 ?        Ssl  13:58   0:00 /usr/sbin/ModemManager
root        1008  0.0  0.5 109856 21664 ?        Ssl  13:58   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/u


# 查看进程信息(prtstat)
# 查看单个进程的详细信息
root@Ubuntu:~# prtstat 911
Process: systemd-network                State: S (sleeping)
  CPU#:  0              TTY: 0:0        Threads: 1
Process, Group and Session IDs
  Process ID: 911                 Parent ID: 1
    Group ID: 911                Session ID: 911
  T Group ID: -1

Page Faults
  This Process    (minor major):      716        20
  Child Processes (minor major):        0         0
CPU Times
  This Process    (user system guest blkio):   0.03   0.08   0.00   0.00
  Child processes (user system guest):         0.00   0.00   0.00
Memory
  Vsize:       16 MB
  RSS:         8396 kB                   RSS Limit: 18446744073709 MB
  Code Start:  0x55d1f13e6000            Code Stop:  0x55d1f1493801
  Stack Start: 0x7ffe53c83d10
  Stack Pointer (ESP):          0        Inst Pointer (EIP):          0
Scheduling
  Policy: normal
  Nice:   0              RT Priority: 0 (non RT)


# 进程树(pstree):查看进程的父子关系
# 查看进程
root@Ubuntu:~# pstree -p
systemd(1)─┬─ModemManager(990)─┬─{ModemManager}(1016)
           │                   └─{ModemManager}(1019)
           ├─VGAuthService(818)
           ├─cron(924)
           ├─dbus-daemon(925)
           ├─irqbalance(931)───{irqbalance}(966)
           ├─login(960)───bash(1438)
           ├─multipathd(571)─┬─{multipathd}(593)
           │                 ├─{multipathd}(597)
           │                 ├─{multipathd}(598)
           │                 ├─{multipathd}(599)
           │                 ├─{multipathd}(600)
           │                 └─{multipathd}(601)
           ├─networkd-dispat(932)
           ├─nginx(1013)─┬─nginx(1014)
           │             └─nginx(1015)
           ├─polkitd(934)─┬─{polkitd}(967)
           │              └─{polkitd}(980)
           ├─rsyslogd(935)─┬─{rsyslogd}(953)
# 查看进程中的用户切换
xie@Ubuntu:~$ pstree -u
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─VGAuthService
        ├─cron
        ├─dbus-daemon(messagebus)
        ├─irqbalance───{irqbalance}
        ├─login───bash
        ├─multipathd───6*[{multipathd}]
        ├─networkd-dispat
        ├─nginx───2*[nginx(www-data)]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd(syslog)───3*[{rsyslogd}]
        ├─sendmail-mta
        ├─snapd───10*[{snapd}]
        ├─sshd─┬─sshd─┬─bash───su───bash(xie)───pstree
        │      │      └─bash───sleep
        │      └─sshd───bash
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-network(systemd-network)
        ├─systemd-resolve(systemd-resolve)
        ├─systemd-timesyn(systemd-timesync)───{systemd-timesyn}
        ├─systemd-udevd
        ├─udisksd───4*[{udisksd}]
        ├─unattended-upgr───{unattended-upgr}
        └─vmtoolsd───3*[{vmtoolsd}]


# 搜索进程(pgrep)
# 查看是否有java程序在运行
root@Ubuntu:~# ps aux |grep java
root       43538  0.0  0.0   6476  2324 pts/0    S+   15:59   0:00 grep --color=auto java
# 搜索xie有关的程序编号
root@Ubuntu:~# pgrep -u xie
43971
44107
root@Ubuntu:~# pgrep -au xie
43971 -bash
44107 ping 192.168.100.134


# pidof:获取程序的进程编号
root@Ubuntu:~# pidof passwd
44866


# 负载查询(uptime)
root@Ubuntu:~# uptime                             
16:10:47 up  2:12,  3 users,  load average: 0.30, 0.27, 0.27 #------>不论cpu的和是多少超过五都不行


# 显示cpu相关统计(mpstat)
# 安装:yum -y install sysstat
# 显示当前CUP的使用情况(steal->被虚拟机所使用的时间,被盗取的时间)
root@Ubuntu:~# mpstat
Linux 5.15.0-58-generic (Ubuntu.xie.org)        02/10/2023      _x86_64_        (2 CPU)

04:28:02 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:28:02 PM  all    0.33    0.01    1.33    0.08    0.00    0.09    0.00    0.00    0.00   98.16

[root@localhost ~]# mpstat
Linux 5.14.0-162.6.1.el9_1.x86_64 (localhost.localdomain)       02/10/2023      _x86_64_        (2 CPU)

04:27:53 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:27:53 PM  all    0.26    0.02    0.46    0.19    0.61    0.14    0.00    0.00    0.00   98.32
# 每一秒更新一次cup使用的情况
root@Ubuntu:~# mpstat 1
Linux 5.15.0-58-generic (Ubuntu.xie.org)        02/10/2023      _x86_64_        (2 CPU)

04:33:45 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:33:46 PM  all    0.50    0.00    2.01    0.00    0.00    0.50    0.00    0.00    0.00   96.98
04:33:47 PM  all    0.00    0.00    0.50    0.00    0.00    0.50    0.00    0.00    0.00   98.99
04:33:48 PM  all    1.01    0.00    1.52    0.00    0.00    0.51    0.00    0.00    0.00   96.97
04:33:49 PM  all    0.51    0.00    1.52    0.00    0.00    0.00    0.00    0.00    0.00   97.98
04:33:50 PM  all    0.51    0.00    1.52    0.00    0.00    0.00    0.00    0.00    0.00   97.97
04:33:51 PM  all    0.00    0.00    1.00    0.00    0.00    0.50    0.00    0.00    0.00   98.50
04:33:52 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.50
04:33:53 PM  all    0.00    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   99.49
04:33:54 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.50
04:33:55 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.50
^CAverage:     all    0.25    0.00    1.01    0.00    0.00    0.20    0.00    0.00    0.00   98.54


# 查看进程实时状态top和htop
# top:实时显示进程的情况
root@Ubuntu:~# top
top - 16:35:54 up  2:37,  3 users,  load average: 0.24, 0.22, 0.25
Tasks: 218 total(总共的进程数),   1 running(运行的进程), 217 sleeping(睡觉中),   0 stopped(停止态),   0 zombie(僵尸态)
%Cpu(s):  0.3 us(用户空间),  1.0 sy(内核空间),  0.0 ni(调整优先级), 98.7 id(空闲),  0.0 wa(io等待),  0.0 hi(硬中断),  0.0 si(软中断),  0.0 st(被盗取时间)
MiB Mem :   3889.8 total(内存大小),   2984.0 free(可用内存),    336.7 used(已经使用内存),    569.1 buff/cache(被占用内存)
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   3307.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    571 root      rt   0  355048  27652   9072 S   0.3   0.7   0:02.62 multipathd
    819 root      20   0  314900   9292   7724 S   0.3   0.2   0:22.55 vmtoolsd
   1479 root      20   0   17580  11436   8664 S   0.3   0.3   0:37.91 sshd
  53821 root      20   0    7368   3608   3348 S   0.3   0.1   0:00.45 bash
  54349 root      20   0       0      0      0 I   0.3   0.0   0:00.14 kworker/0:1-events
      1 root      20   0  167680  13152   8280 S   0.0   0.3   0:04.79 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.06 kthreadd
在top运行时:
帮助:h或?,按q或esc退出帮助
排序:
P:%cup 排序
M:%MEM 排序
T:累计占据CUP时长,TIME+
top选项
-d  :指定刷新时间间隔,默认3秒
-b:全部显示所有进程
-n:刷新多少次后退出
-H:线程模式
-p:指定进程号
只显示线程的信息

# htop 安装:yum -y install htop


# free:显示磁盘信息
[root@localhost ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.7Gi       1.2Gi       292Mi       8.0Mi       429Mi       551Mi
Swap:          2.0Gi       265Mi       1.8Gi


# 进程对应的内存映射pmap:显示进程和内存的使用用情况
root@Ubuntu:~# pmap 47049
47049:   -bash
00005614fa8c8000    188K r---- bash
00005614fa8f7000    892K r-x-- bash
00005614fa9d6000    232K r---- bash
00005614faa11000     16K r---- bash
00005614faa15000     36K rw--- bash
00005614faa1e000     44K rw---   [ anon ]
00005614fac65000   1548K rw---   [ anon ]
00007f4f76177000   2980K r---- locale-archive
00007f4f76460000     12K rw---   [ anon ]
00007f4f76463000    160K r---- libc.so.6
00007f4f7648b000   1620K r-x-- libc.so.6
00007f4f76620000    352K r---- libc.so.6
00007f4f76678000     16K r---- libc.so.6
00007f4f7667c000      8K rw--- libc.so.6
00007f4f7667e000     52K rw---   [ anon ]


# vmstat:查看虚拟内存
root@Ubuntu:~# 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 3046604  61216 526444    0    0    11     3   87  117  0  1 99  0  0


# iotop:监视磁盘I/O   安装:yum -y install iotop


# 显示网络宽带使用情况(iftop):查看网卡
root@Ubuntu:~# iftop -n


# 查看网络实时吞吐量(nload)
[root@localhost ~]# nload



# 查看进程网络带宽的使用情况(nethogs):可以看到程序和网络带宽情况
[root@localhost ~]# nethogs


# 网络监视工具(iptraf-ng)
root@Ubuntu:~# iptraf-ng


# 系统资源统计(dstat):可代替vmstat
[root@localhost ~]# dstat
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw
  0   0  98   0   0|   0     0 | 319B 1268B|   0     0 | 279   358
  1   1  98   0   0|   0     0 | 320B 1094B|   0     0 | 272   358
  1   1  97   0   0|   0     0 | 474B 1195B|   0     0 | 329   371
  1   1  99   0   0|   0     0 | 538B 1267B|   0     0 | 274   354
  1   1  98   0   0|  64k    0 | 320B 1078B|   0     0 | 438   483
  0   0  99   0   0|   0     0 | 320B 1077B|   0     0 | 275   367
  0   1  99   0   0|   0     0 | 320B 1063B|   0     0 | 277   359
  0   0  99   0   0|   0     0 | 538B 1164B|   0     0 | 259   360


# 综合监控工具(glances):可以实现远程监控,监控另一台机器
# 开启服务器
[root@localhost ~]# glances -s
Glances XML-RPC server is running on 0.0.0.0:61209
# 连接远程机器
root@Ubuntu:~# glances -c 192.168.100.134


# 查看进程打开文件(lsof):显示多有进程打开的文件
# 查看22端口是那个程序打开的
[root@localhost ~]# lsof -i :22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      956 root    3u  IPv4  22382      0t0  TCP *:ssh (LISTEN)
sshd      956 root    4u  IPv6  22384      0t0  TCP *:ssh (LISTEN)
sshd     2816 root    4u  IPv4  32475      0t0  TCP localhost.localdomain:ssh->192.168.100.1:52681 (ESTABLISHED)
sshd     2830  xie    4u  IPv4  32475      0t0  TCP localhost.localdomain:ssh->192.168.100.1:52681 (ESTABLISHED)
sshd    76590 root    4u  IPv4 155798      0t0  TCP localhost.localdomain:ssh->192.168.100.1:59841 (ESTABLISHED)
sshd    76593  xie    4u  IPv4 155798      0t0  TCP localhost.localdomain:ssh->192.168.100.1:59841 (ESTABLISHED)
# 查看被打开文件
lsof | grep +文件名


# 新特性(cockpit)
安装:dnf -y install cockpit
启动图形:systemctl enable --now cockpit.socket
作用
监控系统活动(CPU,内存,磁盘IO和网络流量)
查看系统日志条目
查看磁盘分区的容量
查看网络活动(发送和接收)
查看用户账号
检查系统服务的状态
提取已安装应用信息
查看和安装可用更新(如果以root身份登录)并在需要时重新启动系统
打开并使用终端窗口


# 信号发送kill
root@Ubuntu:~# kill -l
 1) SIGHUP(用来加载配置文件)       2) SIGINT(ctrl+c)       3) SIGQUIT(ctrl+'/')      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
# 发送信号,加载配置文件
root@Ubuntu:~# kill -1 1015 #1015是进程编号

CTRL+z:将正在运行的程序放置后台停止,以便终端的继续使用



# jobs:查看后台停止的程序
bg +1:将后台停止状态的进程,变成后台运行的程序
fg:将后台运行的程序放置前台运行

任务相关的命令: at, crontab

# 一次性任务(at)
# 标准输出和标准错误都不会显示
[root@localhost ~]# at 15:13
warning: commands will be executed using /bin/sh
at> touch /data/at.log
at> <EOT>#CTRL+d:退出
job 1 at Sat Feb 11 15:13:00 2023

# 两分钟之后执行任务
[root@localhost ~]# at now+2min
warning: commands will be executed using /bin/sh
at> touch /data/at2.log
at> <EOT>
job 2 at Sat Feb 11 15:19:00 2023
[root@localhost ~]# at -l
2       Sat Feb 11 15:19:00 2023 a root
# 删除计划任务
at -d 2



# 用户创建的计划任务(crontab)
# 存放地址:/var/spool/cron/
# 执行计划任务
[root@localhost ~]# crontab -e
# 产看计划是否执行
[root@localhost ~]# cat /var/log/cron
# 查看计划任务内容
[root@localhost ~]# crontab -l
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
* * * * * echo $PATH >> /data/path.log; ip address &> /data/ip.log
# 删除计划任务
[root@localhost ~]# crontab -r
[root@localhost ~]# cat /var/spool/cron
cat: /var/spool/cron: Is a directory
# 指定以xie的用户来执行计划任务
crontab -e -u xie

# 控制黑名单和白名单
/etc/cron.{allow,deny}


2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。

1)数值索引:

数值索引:索引的编号从0开始

声明数组:declare -a NAME

删除数组:unset NAME

交互式数组赋值:read -a NAME

# 列出所有数组
[root@localhost ~]# declare -a
declare -a BASH_ARGC=([0]="0")
declare -a BASH_ARGV=()
declare -a BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
declare -a BASH_LINENO=()
declare -a BASH_REMATCH=()
declare -a BASH_SOURCE=()
declare -ar BASH_VERSINFO=([0]="5" [1]="1" [2]="8" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
declare -a DIRSTACK=()
declare -a FUNCNAME
declare -a GROUPS=()
declare -a PIPESTATUS=([0]="0")
declare -a title=([0]="ceo" [1]="coo" [2]="cto")
# 只看title数组0号元素的值
[root@localhost ~]# echo ${title[0]}
ceo
# 显示students的所有元素
[root@localhost ~]# students=(zhang han luo wang hu)

[root@localhost ~]# echo ${students[*]}
zhang han luo wang hu
[root@localhost ~]# echo ${students[@]}
zhang han luo wang hu
# 数组赋值
[root@localhost ~]# title[0]=ceo
# 一次全部赋值
[root@localhost ~]# students=(zhang han luo wang hu)
[root@localhost ~]# echo ${students[0]}
zhang
[root@localhost ~]# echo ${students[1]}
han
[root@localhost ~]# echo ${students[2]}
luo
[root@localhost ~]# echo ${students[3]}
wang
[root@localhost ~]# echo ${students[4]}
hu
# 生成五个元素
[root@localhost ~]# number=({6..10})
[root@localhost ~]# echo ${number[*]}
6 7 8 9 10
# 交互式赋值
[root@localhost ~]# read -a car
benz audi bmw
[root@localhost ~]# echo ${car[*]}
benz audi bmw

2) 关联索引:索引可支持自定义的格式,不仅仅是数字,bash4.0之后支持

# 声明数组:declare -A NAME
[root@localhost ~]# declare -A m48
[root@localhost ~]# m48[birth]="2022.2.8"
[root@localhost ~]# m48[num]=60
[root@localhost ~]# m48[classroom]=room3
[root@localhost ~]# m48[monitor]=zhang
[root@localhost ~]# echo ${m48[*]}
60 2022.2.8 room3 zhang
[root@localhost ~]# echo ${m48[num]}
60
[root@localhost ~]# echo ${m48[monitor]}]}
zhang]}
[root@localhost ~]# echo ${m48[monitor]}
zhang
[root@localhost ~]# echo ${m48[birth]}
2022.2.8

# 跳过三个数取四个数
[root@localhost ~]# num=({1..10})
[root@localhost ~]# echo ${num[*]}
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# echo ${num[*]:3:4}
4 5 6 7
# 查看元素的个数
[root@localhost ~]# echo ${#num[*]}
10
# 新添加一个元素
[root@localhost ~]# num[${#num[*]}]=11

[root@localhost ~]# echo ${num[*]}
1 2 3 4 5 6 7 8 9 10 11

3) 字符串处理:

# 基于模式取字符串
# 从左到右找到'/'把斜杠和前面的内容删除
[root@localhost data]# url=http://www.baidu.com/index.html
[root@localhost data]# echo ${url#*/}
/www.baidu.com/index.html
# 删除所有斜杠之前的呢容
[root@localhost data]# echo ${url##*/}
index.html

# 从右到左找到'/'把斜杠和后面的内容删除
[root@localhost data]# url=http://www.baidu.com/index.html
[root@localhost data]# echo ${url%/*}
http://www.baidu.com

# 查找替换
[root@localhost data]# echo $url
http://www.baidu.com/index.html
[root@localhost data]# echo ${url/baidu/taobao}
http://www.taobao.com/index.html
[root@localhost data]# echo ${url/w/2}
http://2ww.baidu.com/index.html
[root@localhost data]# echo ${url//w/2}
http://222.baidu.com/index.html

# 查找删除
[root@localhost data]# echo $url
http://www.baidu.com/index.html
[root@localhost data]# echo ${url/w}
http://ww.baidu.com/index.html
[root@localhost data]# echo ${url//w}
http://.baidu.com/index.html

# 大小写转换
[root@localhost data]# echo $url
http://www.baidu.com/index.html
[root@localhost data]# echo ${url^}
Http://www.baidu.com/index.html
[root@localhost data]# echo ${url^^}
HTTP://WWW.BAIDU.COM/INDEX.HTML
# 转换成小写
${url,,}

4) 高级变量使用:

变量替换和测试

    变量替换:

        ①、${变量#匹配规则} #从头开始匹配,最短删除;

        ②、${变量##匹配规则} #从头开始匹配,最长删除;

        ③、${变量%匹配规则} #从尾开始匹配,最短删除;

        ④、${变量%%匹配规则} #从尾开始匹配,最长删除;

        ⑤、${变量/旧字符串/新字符串} #替换变量内的旧字符串为新字符串,只替换第一个旧字符串

        ⑥、${变量//旧字符串/新字符串} #替换变量内的旧字符串为新字符串,全部替换;

字符串处理

    计算字符串长度:

        ${#string}

        expr length "$string"  //字符串中有空格则必须加引号

    获取子字符串中的索引位置:(获取的是字符的位置不是字符串的位置)

        expr index $string $substring //获取满足$substring条件的字符串在$string中的索引位置

    计算子串长度:

        expr match $string substr //从头部开始匹配

    抽取子串:

         ${string:position} 从 string中的position开始

         ${string:position:length} 从position开始,匹配长度为length

         ${string: -position} 从右边开始匹配

         ${string:(position)} 从左边开始匹配 ,索引从0开始

         expr substr $string $position $length 从position开始,匹配长度为length,索引从1开始

命令替换

    所谓命令替换就是将某一段需要命令执行的结果作为另一个shell命令的一部分。

     语法格式:

         `command` (反引号)

         $(command)

有类型变量

    通过declare声明变量类型

         var1="hello world" 

         declear -r $var1 //声明var1为只读变量

         declare -i - //声明为整形

         declare -a - //声明为数组

         (数组定义: arr=("mike" "joe" "juny"))

         declare -f //显示定义的函数和内容

         declare -f //显示定义的函数,不会显示内容

         declare -x - //声明变量为环境变

         (取消声明变量:把减号'-'换成加号'+')

数学运算:expr

(运算时,特殊符号要转义:| < > * & <= >=)

expr $num1 opearator $num1 //只能进行整数运算

$(($num1 opearator $num1)) //'*'不需要转义,在比较判断时可能出错,只能进行整数运算

3. 求10个随机数的最大值与最小值。

root@142:~# cat test.sh
#!/usr/bin/bash
# 生成10个随机数,并找出其中的最大值和最小值
 
declare -a rand
declare -i max=0
declare -i min=0
 
for i in {0..9}
do
        rand[i]=$RANDOM
 
        if [ $i -eq 0 ];then
                min=${rand[i]}
                max=${rand[i]}
        fi
 
        if [ $min -gt ${rand[i]} ];then
                min=${rand[i]}
        fi
 
        if [ $max -lt ${rand[i]} ];then
                max=${rand[i]}
        fi
done
 
echo "Min:${min}"
echo "Max:${max}"
echo "Array length: ${#rand[@]}, Array:${rand[@]}"
root@142:~# bash test.sh
Min:158
Max:30655
Array length: 10, Array:21580 16991 24175 13158 158 21463 18324 24223 21647 30655


4. 使用递归调用,完成阶乘算法实现。

root@142:~# cat test2.sh
#!/bin/bash

echo "请输入"

read n

echo

func ()

{

local i="$1"

if [ "$i" -eq 0 ]; then

result=1

else

let "m=i-1"

func "$m"

let "result=$i * $?"

fi

return $result

}

func "$n"

echo "$n的阶乘为:$?"
root@142:~# bash test2.sh
请输入
5

5的阶乘为:120


3. 解析进程和线程的区别?

        什么是进程?(进程相当于公司,线程相当于公司里的员工,两者资源共享)

正在运行中的程序,一个磁盘文件在内存中运行的副本,

进程ID:用来标记各个进程,只要进程存在就有,进程结束,进程编号被回收,同一时间进程只有唯一的编号

线程试运行的最小单位

进程存在生命周期

4. 解析进程的结构。

一、数据写入进程(DBWn)

数据写入进程是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。
作用
简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。
会话的更新,插入,删除包括查询等都是先作用到缓冲区上,随后,DBWn会将其中的脏缓冲区转储到磁盘上去。 
以下四种情况DBWn会执行写入
1、没有任何可用缓冲区(不得不写啊)
2、脏缓冲区过多
3、3秒超时(最晚3秒会执行一次写入)
4、遇到检查点,即checkPoint(检查点),检查点是个Oracle事件,遇到检查点,DBWn会执行写入。比如实例有序关闭的时候会有检查点,DBWn会将所有脏缓冲区写入到磁盘上去的,这很容易理解,要保持数据文件的一致性。

二、日志写入进程(LGWR)

日志写入进程(LGWR)就是把日志缓冲区内的内容写入到磁盘的重做日志文件中去,相比数据库写入器(DBWn),日志写入器就勤快多了。
以下五种情况LGWR会执行写入
1、log buffer里写满1M了。
2、每三秒将日志缓冲区输出。
3、当日志缓冲区的1/3已满时将日志缓冲区输出。
4、当用户进程提交一事务时写入一个提交记录。
5、当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。

三、SMON(System Monitor)

它的主要职责有如下:
1、实例恢复
2、每3秒整理区碎片
3、清理临时段

四、PMON(Process Monitor)

进程监视进程,主要监视服务器进程。
当碰到了进程异常,将做如下处理
1、释放该进程的buffer cache资源
2、进程相关的锁资源
3、其他资源,比如进程号等信息,v$process可以看到的一些信息
4、检查调度器和服务器进程,来实现调度器分配请求队列和响应队列
5、PMON还有一个任务,它可以实现服务注册

五、CKPT(Checkpoint Process)

检查点是一个维护数据库一致性的重要的后台进程
检查点是一个数据库事件,它将已修改的数据从脏缓存里刷新到磁盘,并更新控制文件和数据文件的一致性信息
手动设置检查点的语法
alter system checkpoint;

六、MMON(Manageability Monitor)

  数据库的自我监视和自我调整的支持进程。实例在运行中,会收集大量有关实例活动和性能的统计数据,这些数据会收集到SGA中,MMON定期从SGA中捕获这些统计数据,并将其写入到数据字典中,便于后续对这些快照进行分析。(默认情况,MMON每隔一个小时收集一次快照)

七、ARCn(Archiver)

归档进程,这个进程是可选的,如果数据库配置为归档模式,这个进程就是必须的。

八、RAC相关后台进程

1、锁监视器(Lock monitor,LMON)进程
2、锁管理器守护(Lock manager daemon,LMD)进程
3、锁管理器服务器(Lock manager server,LMSn)进程
4、可诊断性守护(Diagnosability daemon,DIAG)进程
5、锁(Lock,LCK0)进程
6、CRS相关的进程

九、ASM相关进程

ASM实例除了传统的DBWR,LGWR,CKPT,SMON,PMON等进程还包含如下后台进程:
1、自动存储管理后台(Automatic Storage Management Background,ASMB)进程: ASMB与ASM 实例的前台进程连接,周期性的检查两个instance的健康状况。每个数据库实例同时只能与一个ASM实例连接,因此数据库只会有一个ASMB后台进程。
2、重新平衡(Rebalance,RBAL)进程:负责协调磁盘组的重新平衡活动(负责磁盘组均衡)
3、CJQ0 和Jnnn 进程:作业队列
4、QMNC 和Qnnn:高级队列
5、EMNn:事件监视器进程(Event Monitor Process)
6、MMAN:内存管理器(Memory Manager)
7、ARB0-ARBn:在同一时刻可以存在许多此类进程,它们分别名为ARB0、ARB1,以此类推,执行实际的重新平衡分配单元移动进程。
8、GMON:用于ASM磁盘组监控
9、O0nn 01-10:这组进程建立到ASM实例的连接,某些长时间操作比如创建数据文件,RDBMS会通过这些进程向ASM发送信息。


5. 解析磁盘中的代码如何在计算机上运行的?

        我们写的程序是放在硬盘中的,在运行的时候才会被加载到内存中,也就是说内存中的数据都是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,然后CPU会根据相应的指令去操作寄存器中的数据,比如四则运算什么的,来完成一个程序在计算机中的运行。


6. 总结OOM原理,及处理方法。

OOM全称是Out Of Memory,指的是kernel因分配不出内存而报的错误,同时会触发kernel调用OOM killer杀进程来解除这种状况

当前Linux实例的内存不足以支撑业务的运行
您可以升级实例内存配置。


7. 结合进程管理命令,说明进程各种状态。

1)管理进程工具:

ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job

2)进程各种状态:

running(运行的进程),sleeping(睡觉中), stopped(停止态),  zombie(僵尸态)


8. 说明IPC通信和RPC通信实现的方式。

        本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。

  远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNIX操作系统的计算机中。

  通过IPC和RPC,程序能利用其它程序或计算机处理的进程。客户机/服务器模式计算把远程过 程调用与其它技术如消息传递一道,作为系统间通信的一种机制。客户机执行自己的任务,但靠服务器提供后端文件服务。RPC为客户机提供向后端服务器申请服 务的通信机制,如图R-4所示。如果你把客户机/服务器应用程序想作是一个分离的程序,服务器能运行数据访问部分,因为它离数据最近,客户机能运行数据表 示和与用户交互的前端部分。这样,远程过程调用可看作是把分割的程序通过网络重组的部件。LPC有时也称耦合(Coupling)机制。


9. 通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?


10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。

后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互;Linux的大多数服务器就是使用守护进程实现的。比如Web服务器的httpd等。

CTRL+z:将正在运行的程序放置后台停止,以便终端的继续使用

jobs:查看后台停止的程序

bg +1:将后台停止状态的进程,变成后台运行的程序

fg:将后台运行的程序放置前台运行


11. 总结内核设计流派及特点。

内核的功能:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

1)内核设计流派:

        单内核设计:把所有功能集成于同一个程序,而后每一个功能在就在程序内部使用线程来实现,这就是内核线程,这种设计好处在于大家结合的更紧密,效率高,但是问题在于任何一个地方产生故障可能会影响全局,Linux是这种设计
微内核设计:每一个功能都使用一个独立的子系统实现,而后在找一个中央调配协调系统,当我们用到什么功能时,就让这些子系统彼此间通信来完成任务。每一个子系统都独立运作,我们可以用一个松散框架将它们联合在一起,问题就是可能效率低,但每一个子系统出现问题不至于影响全局。不过,话虽如此,目前来看虽然微内核设计在理论上是先进的,但是由于其内部的协调机制过于复杂,使得它的任何优越性基本上没能体现,Windows,Solaris就是这种设计

2)特点:

        支持模块化:Linux也充分借鉴了微内核设计的思想,内部的各种功能都被做成独立的功能模块而不是子系统,子系统里面可能包括很多模块并且拥有自制机制,而内核模块就像用户空间库的概念,不过库是被应用程序调用的,而内核模块只能被内核调用,文件名称都以.ko结尾(kernel object)。通过模块化也使得Linux内核不会变得过于庞大,用到哪个模块功能就装载哪个
支持模块的动态装、卸载:在线装载、卸载模块


12. 总结centos 6 启动流程,grub工作流程

1)centos6启动流程:

POST加电自检,即加载BIOS的硬件信息,获取第一个启动设备
读取第一个启动设备MBR的引导加载程序(grub)的启动信息
加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
核心执行init程序,并获取默认的运行信息
init程序执行/etc/rc.d/rc.sysinit文件
启动核心的外挂模块
init执行运行的各个批处理文件(scripts)
执行/bin/login程序,等待用户登录
登录之后开始以Shell控制主机启动流程

2)grub工作流程:

Grub启动引导阶段
    grub引导也分为三个阶段stage1阶段、stage1.5阶段和stage2阶段。

阶段 1
    如上文 POST(上电自检)阶段提到的,在 POST 阶段结束时,BIOS 将查找在接入的磁盘中查找引导记录,其通常位于 MBR(主引导记录Master Boot Record),它加载它找到的第一个引导记录中到内存中,并开始执行此代码。引导代码(及阶段 1 代码)必须非常小,因为它必须连同分区表放到硬盘的第一个 512 字节的扇区中。 在传统的常规 MBR 中,引导代码实际所占用的空间大小为 446 字节。这个阶段 1 的 446 字节的文件通常被叫做引导镜像(boot.img),其中不包含设备的分区信息,分区是一般单独添加到引导记录中。

由于引导记录必须非常的小,它不可能非常智能,且不能理解文件系统结构。因此阶段 1 的唯一功能就是定位并加载阶段 1.5 的代码。为了完成此任务,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。在加载阶段 1.5 代码进入内存后,控制权将由阶段 1 转移到阶段 1.5。

阶段 1.5
    如上所述,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。该空间由于历史上的技术原因而空闲。第一个分区的开始位置在扇区 63 和 MBR(扇区 0)之间遗留下 62 个 512 字节的扇区(共 31744 字节),该区域用于存储阶段 1.5 的代码镜像 core.img 文件。该文件大小为 25389 字节,故此区域有足够大小的空间用来存储 core.img。

因为有更大的存储空间用于阶段 1.5,且该空间足够容纳一些通用的文件系统驱动程序,如标准的 EXT 和其它的 Linux 文件系统,如 FAT 和 NTFS 等。故阶段 2 的文件可以存放于 /boot 文件系统中,一般在 /boot/grub 目录下。

注意 /boot 目录必须放在一个 GRUB 所支持的文件系统(并不是所有的文件系统均可)。阶段 1.5 的功能是开始执行存放阶段 2 文件的 /boot 文件系统的驱动程序,并加载相关的驱动程序。

阶段 2
    GRUB 阶段 2 所有的文件都已存放于 /boot/grub 目录及其几个子目录之下。该阶段没有一个类似于阶段 1 与阶段 1.5 的镜像文件。相应地,该阶段主要需要从 /boot/grub2/i386-pc 目录下加载一些内核运行时模块。

GRUB 阶段 2 的主要功能是定位和加载 Linux 内核到内存中,并转移控制权到内核。内核的相关文件位于 /boot 目录下,这些内核文件可以通过其文件名进行识别,其文件名均带有前缀 vmlinuz。你可以列出 /boot 目录中的内容来查看操作系统中当前已经安装的内核。

Red Hat 包管理器(DNF)支持保留多个内核版本,以防最新版本内核发生问题而无法启动时,可以恢复老版本的内核。默认情况下,GRUB 提供了一个已安装内核的预引导菜单,其中包括问题诊断菜单(recuse)以及恢复菜单(如果配置已经设置恢复镜像)。

阶段 2 加载选定的内核到内存中,并转移控制权到内核代码。

加载内核
    根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。


13. 手写chkconfig服务脚本,可以实现服务的开始,停止,重启。

[root@localhost ~]# vim /lib/systemd/system/chkconfig.service
[Unit]
Description=Chkconfig server
After=network.target

[Service]
User=chkconfig
Group=chkconfig

ExecStart=/apps/Chkconfig/bin/Chkconfig-server /apps/Chkconfig/etc/Chkconfig.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target


14. 总结systemd服务配置文件

/usr/lib/systemd/system #每个服务最主要的启动脚本设置

/lib/systemd/system #ubuntu的对应目录,兼容于centOS7,8和Ubuntu

/run/systemd/system #系统执行过程中所产生的服务脚本,比上面目录优先运行

/etc/systemd/system #管理员创建的执行脚本


15. 总结system启动流程

  1. UEF或BIOS初始化,运行POST开机自检
  2. 选择启动设备
  3. 引导装载程序,centOS7是grub2加载程序的配置文件:
    • /etc/grub.d/
    • /etc/default/grub
    • /boot/grub2/grub.cfg
  1. 加载initramfs驱动模块(可以实现根文件系统的挂载)
  2. 加载内核选项
  3. 内核初始化,centOS使用systemd代替init
  4. 执行initrd.target所有单元,包括挂载/etc/fstab
  5. 从initasmfs根文件系统切换到磁盘根目录
  6. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
  7. systemd执行sysinit.target初始化系统及basic.target准备操作系统
  8. systemd启动multi-user.target下的本机于服务器服务
  9. systemd执行multi-user.target下的/etc/rc.d/rc.local
  10. ststemd执行multi-user.target下的getty.target及登录服务
  11. systemd执行graphical需要的服务


16. 总结awk工作原理,awk命令,选项,示例。

1)awk工作原理:

        逐行读取文本,默认以空格或tab键为分隔符进行分隔,

        将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

2)awk命令:

        awk [-F field-separator] 'commands' input-file(s)其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。


17. 总结awk的数组,函数。

1)数组:

# 去重
root@Ubuntu:~# cat /data/test.txt
a
b
c
a
b
c
a
b
c
d
r
s
d
root@Ubuntu:~# awk '!line[$0]++' /data/test.txt
a
b
c
d
r
s

   2)函数:

# 生成随机数
root@Ubuntu:~# awk 'BEGIN{srand();print rand()}'
0.0253289
root@Ubuntu:~# awk 'BEGIN{srand();print rand()}'
0.778805
# 1-100随机数
root@Ubuntu:~# awk 'BEGIN{srand();print int(rand()*100)}'
71
root@Ubuntu:~# awk 'BEGIN{srand();print int(rand()*100)}'
94

字符串处理
length([s]):返回指定字符串长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配的内容替换成s,懒惰模式
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
split(s,array,[r]):以r为分割符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二人格索引值为2...
system():括号里能执行linux命令
systime():当前时间到1970-1-1的秒数
strftime():指定时间格式


# 自定义函数
形参:定义函数时的参数,占位符
实参:使用函数实际正在使用的参数

root@Ubuntu:~# cat /data/a.awk
BEGIN{print strftime("%Y-%m-%d T%H:%M",systime())}
root@Ubuntu:~# awk -f /data/a.awk
2023-02-15 T14:23

root@Ubuntu:~# cat test.awk
function max(x,y) {
        x>y?var=x:var=y
        return var
}
BEGIN{print max(a,b)}

root@Ubuntu:~# awk -v a=10 -v b=30 -f test.awk
30
root@Ubuntu:~# awk -v a=100 -v b=30 -f test.awk
100


18. 总结ca管理相关的工具,根据使用场景总结示例。

ca相当于中间人的角色

# 创建文件
[root@localhost ~]# mkdir /etc/pki/CA/certs
[root@localhost ~]# mkdir /etc/pki/CA/newcerts
[root@localhost ~]# mkdir /etc/pki/CA/crl
[root@localhost ~]# mkdir /etc/pki/CA/private
[root@localhost ~]# tree /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── newcerts
└── private

# 创建私有CA
#生成证书索引数据库文件
touch /etc/pki/CA/index.txt
#指定第一个变法证书的序列号
echo 01 > /etx/pki/CA/serial

# 生成CA私钥
cd /etc/pki/CA
(umask 066;openssl genrsa -out /private/cakey.pem 2048)

# 生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
#选项说明
-new :生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE:证书的保存路径

国家代码:https://country-code.cl/

# 将生成的CA自签名证书变成可读
[root@localhost CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            51:a7:af:51:f2:66:17:63:ac:a2:4d:7e:48:29:60:e8:e5:8a:ff:59
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = shanghai, L = shanghai, O = magedu, OU = xie1, CN = ca.magedu.org, emailAddress = admin@magedu.org
        Validity
            Not Before: Feb 16 06:12:58 2023 GMT
            Not After : Feb 13 06:12:58 2033 GMT
        Subject: C = CN, ST = shanghai, L = shanghai, O = magedu, OU = xie1, CN = ca.magedu.org, emailAddress = admin@magedu.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cf:a9:99:0d:ac:a9:c0:d7:ba:05:7f:5e:ae:8c:
                    7b:d8:df:f4:3d:63:50:02:2d:1b:d9:b2:19:bb:e6:
                    c3:0d:20:49:62:1e:5a:d9:ae:a9:59:6d:c0:f4:f2:
                    38:74:af:8e:5d:43:d4:11:4d:6a:c7:4c:83:33:2e:
                    0d:ca:ce:b4:ea:25:d1:bd:46:32:a9:09:ef:ab:4d:
                    ae:d9:81:d2:9d:8c:9b:f2:80:7b:f1:e1:f1:23:0b:
                    2d:70:7b:29:28:14:51:4f:e2:c9:1a:ae:b5:ad:ea:
                    12:43:fb:8b:ef:e0:dd:fc:70:52:2d:59:fe:05:a3:
                    dd:85:03:30:31:20:a8:41:41:13:d6:cc:ac:ae:ff:
                    e1:3a:4e:0f:cc:7a:85:a2:4a:ba:a4:e7:df:9b:d8:
                    0e:44:e4:e8:cd:f7:9c:c2:a8:b4:82:a5:3c:41:f2:
                    5e:31:d7:ef:c9:32:6e:0a:71:72:78:f7:31:f1:0b:
                    29:e4:b4:f9:ce:47:5e:09:c7:66:8a:d9:df:0e:4f:
                    64:6d:78:51:37:c6:ba:4f:27:ba:a8:30:89:5d:c8:
                    e3:8c:f4:75:9b:b8:61:8e:cd:5f:72:48:ea:6e:ab:
                    27:55:58:3f:f9:e7:1f:96:85:bb:af:a3:1f:a6:69:
                    b0:94:ad:30:62:9c:7e:a4:12:1e:2a:11:9d:03:d8:
                    b1:61
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                E4:D1:82:D3:5C:F7:DB:22:A5:CF:FD:7A:23:FF:8A:D1:71:C9:E0:3D
            X509v3 Authority Key Identifier:
                E4:D1:82:D3:5C:F7:DB:22:A5:CF:FD:7A:23:FF:8A:D1:71:C9:E0:3D
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        82:49:79:81:f6:4a:6e:4a:1c:01:c9:c2:3b:b8:c5:97:79:8b:
        e5:8c:ef:c2:44:9a:3e:4b:2e:de:97:64:15:7d:b9:44:c3:5c:
        42:16:eb:ff:f9:34:ba:ba:53:ac:b0:10:93:ff:0f:b2:ba:96:
        7b:d3:75:58:10:ca:2f:7d:52:d5:5b:96:8b:18:35:d8:99:41:
        c6:fe:e1:9a:a6:58:df:2f:be:47:68:ea:ee:1b:af:bd:9c:94:
        58:ae:1a:4d:a1:a8:2d:ac:06:88:cd:ec:ce:b1:e8:98:d7:81:
        e5:9c:73:94:96:fd:d9:1b:cf:87:fd:01:af:55:10:8a:35:e5:
        7e:86:15:45:a8:b4:59:62:01:62:28:d1:34:9a:58:03:f0:7a:
        a6:3b:79:63:b5:eb:2a:ee:af:a4:4c:27:8e:e0:7d:4f:ec:c5:
        cf:26:a3:c4:f4:a1:4f:1d:39:f7:85:6e:34:68:73:ea:48:2a:
        3b:a0:de:80:d5:75:f9:dc:0e:70:63:4e:76:0f:90:b1:75:1a:
        88:0f:80:9c:50:a0:3c:9d:b0:84:36:98:ac:58:95:ff:fa:57:
        72:41:02:93:3d:23:bd:1f:fe:79:a8:b9:e4:e0:5a:36:af:14:
        42:f2:88:47:18:40:dc:e9:00:f1:8b:4f:84:19:b8:54:06:7b:
        dd:1f:2e:2d

# 申请证书并颁发证书
为需要使用证书的主机生成私钥
(umask 066; openssl genrsa -out /data/test.key 2048
为需要使用证书的主机生成证书申请文件
openssl req -new -key /data/test.key -out /data/test.csr
在CA签署证书并将证书颁发给请求者
openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
注意:默认要求国家、省、公司名称必须一致
查看证书中的信息
openssl x509 -in /etc/pki/CA/cacert.pem -noout -text 
#查看指定编号的证书状态
openssl ca -status SERIAL

# 吊销证书
在客户端获取要吊销的证书serial
openssl x509 -in /etc/pki/CA/cacert.pem -noout -serial -subject
在CA上,根据客户提交的serial与subject信息,对比校验是否与index.txt文件中的信息一致,吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
指定第一个吊销证书的编号,注意:第一次更新吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
更新吊销证书列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
查看crl文件
openssl crl -in /etc/pki/CA/crl.pem -noout -test


19. 总结openssh免密认证原理,及免认证实现过程。

#1生成公钥私钥
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:ILFr4RV2VR5YUS86yoYCiV0PEHZU17wvOzUWpe1LGNk root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|    =o=.o.o*=o.  |
|   . * o ...o. ..|
|    + =     ..++.|
|   + B +    .+oE.|
|  . B   S   o.oo |
|   . .   o ..o=..|
|      . . +  =...|
|       . .  o  . |
|             .   |
+----[SHA256]-----+
[root@localhost ~]# ls .ssh
id_rsa  id_rsa.pub

#2。自己连接自己
[root@localhost ~]# ssh-copy-id 192.168.100.134
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.134's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.100.134'"
and check to make sure that only the key(s) you wanted were added.


[root@localhost ~]# ll .ssh
total 20
-rw------- 1 root root  580 Feb 16 16:11 authorized_keys
-rw------- 1 root root 2610 Feb 16 15:59 id_rsa
-rw-r--r-- 1 root root  580 Feb 16 15:59 id_rsa.pub
-rw------- 1 root root  843 Feb 16 16:11 known_hosts
-rw-r--r-- 1 root root   97 Feb 16 16:00 known_hosts.old
drwx------ 2 root root   48 Feb 16 16:02 ssh-copy-id.PKjkIpzwnF

#3.将文件夹拷贝到要连接的机器中
[root@localhost ~]# scp -r .ssh 192.168.100.131:/root/
The authenticity of host '192.168.100.131 (192.168.100.131)' can't be established.
ED25519 key fingerprint is SHA256:0GW9Izhoa5yHVB24Adba3W+ko86HUDeDw8lROo2GM6c.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.100.131' (ED25519) to the list of known hosts.
root@192.168.100.131's password:
id_rsa                                                                            100% 2610     1.3MB/s   00:00
id_rsa.pub                                                                        100%  580     1.1MB/s   00:00
known_hosts                                                                       100% 1686     3.8MB/s   00:00
popids_tmp_id                                                                     100%  580     1.4MB/s   00:00
popids_output                                                                     100%   92   126.9KB/s   00:00
authorized_keys                                                                   100%  580     1.4MB/s   00:00
known_hosts.old                                                                   100%  940     2.2MB/s   00:00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值