第四周作业:shell脚本进阶和进程性能管理&进程性能管理任务计划&systemd服务管理和启动流程&安全技术

本文介绍了Bash脚本中的索引数组和关联数组的使用,包括字符串处理的各种操作,如切片和模式匹配。此外,还讨论了高级变量的声明和类型设定,以及内存管理中遇到的OOM问题及其解决方案。同时,提到了进程间通信(IPC)和远程过程调用(RPC)的实现方式,以及消息队列在并发问题中的应用。
摘要由CSDN通过智能技术生成

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

索引:
索引的编号从 0 开始,属于数值索引
索引可支持使用自定义的格式,而不仅是数值格式,即为 关联索引 bash 4.0 版本之后开始支持
bash 的数组支持稀疏格式(索引不连续)
关联数组:
注意:关联数组必须先声明再调用
declare -A ARRAY_NAME 
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)
# 普通数组可以不事先声明 , 直接使用 declare -a ARRAY_NAME
# 关联数组必须先声明 , 再使用 declare -A ARRAY_NAME
注意:两者不可相互转换
字符串处理:
字符串切片-基于偏移量取字符串
#返回字符串变量var的字符的长度,一个汉字算一个字符
${#var} 
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset} 
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-
length前空格,并且length必须大于offset
${var: -length:-offset}

范例:
[root@localhost ~]# str=123456789
[root@localhost ~]# echo ${#str}
9
[root@localhost ~]# echo ${str:2}
3456789
字符串切片- 基于模式取子串:
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字
符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
#从var变量的值中删除以word开头的部分
${var#word}
#同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var##word}
#其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 
删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第
一个word为界删右留左
${var%word*}
${var%word}
#同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向
左的最后一个word为界删右留左
${var%%word*}
${var%%word}

高级变量赋值:

高级变量用法 - 有类型变量
Shell 变量一般是无类型的,但是 bash Shell 提供了 declare typeset 两个命令用于指定变量的类型,两个命令是等价的。
declare [选项] 变量名
选项:
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示已定义的所有函数名及其内容
-F 仅显示已定义的所有函数名
-x 声明或显示环境变量和函数,相当于export 
-l 声明变量为小写字母 declare -l var=UPPER
-u 声明变量为大写字母 declare -u var=lower
-n  make NAME a reference to the variable named by its value

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

[root@localhost data]# cat random_mix_or_max.sh 
#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do
     nums[$i]=$RANDOM
     [ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]} && continue
     [ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
     [ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo Max is $max
echo Min is $min


[root@localhost data]# . random_mix_or_max.sh 
All numbers are 17412 13765 21528 17397 15326 16550 7531 14570 10271 14991
Max is 21528
Min is 7531

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

  • 线程是程序执行最小单位,而进程是操作系统分配资源最小单位;
  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
  • 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进 程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
  • 调度和切换:线程上下文切换比进程上下文切换要快得多。

5. 解析磁盘中的代码如何在计算机上运行的?
6. 总结OOM原理,及处理方法。

OOM Out Of Memory 内存用完了 ”, 在情况在 java 程序中比较常见。系统会选一个进程将之杀死。
在日志 messages中看到类似下面的提示:
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
JVM 因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个 error,因为这个问题已经严重到不足以被应用处理)。
原因:
给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的 VM 参数指定)太少。
应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
1 ,限制 java 进程的 max heap ,并且降低 java 程序的 worker 数量,从而降低内存使用
2 ,给系统增加 swap 空间
设置内核参数(不推荐),不允许内存申请过量:
echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio
echo 2 > /proc/sys/vm/panic_on_oom


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

IPC: Inter Process Communication 进程间通信

pipe    管道,单向传输
socket  套接字文件,双工通信
Memory-maped file   文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
shm shared memory 共享内存
signal  信号
Lock    对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
semaphore 信号量,一种计数器
不同主机: socket=IP 和端口号
RPC:remote procedure call   远程过程调用
MQ 消息队列,生产者和消费者,如:Kafka,RabbitMQ,ActiveMQ

9. 通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?
10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台:
运行中的作业: Ctrl+z

尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系。

nohup COMMAND &>/dev/null & 
screen;COMMAND
tmux;COMMAND
查看当前终端所有作业: jobs
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=128 time=23.4 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=128 time=41.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=3 ttl=128 time=38.6 ms
^Z
[2]+  Stopped                 ping www.baidu.com
[root@localhost ~]# jobs
[1]-  Stopped                 ping www.baidu.com
[2]+  Stopped                 ping www.baidu.com
[root@localhost ~]# 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值