赞
踩
第四周
trap 常见命令
trap '触发指令' 信号 ///将执行自定义信号,不会执行原操作
trap '' 信号 //忽略信号操作
trap '-' 信号 //#恢复原信号的操作
trap -p //#列出自定义信号操作
trap finish EXIT //#当脚本退出时,执行finish函数
常见选项:
-m MODE,默认755 -o OWNER -g GROUP -d DIRNAME 目录
示例:将file.txt文件复制到’/data中‘,并更改其权限; install -m 644 file.txt /data
[root@C8M-1 ~] temp_file=$(mktemp /data/testXXXX.log) //创建临时文件并选择临时文件存放路径 [root@C8M-1 ~] echo $temp_file /data/testREVB.log [root@C8M-1 ~] ls /data/ 1.conf 2.txt 5.conf boot data etc2023-02-27_18-13-24 etc.tar testREVB.log 1.txt 3.conf a1.conf d1.log- dev etc.bak- f1.txt yum.repos.d.bak-2023-02-08_14-55-52 1.txt.bak 3.txt a.conf d1.log-F_17-06-07 etc2023-02-27 etc.bak-2023-02-23_15-17-41 proc 2.conf 4.conf b3.log.bak d2.log-2023-02-02_17-06-34 etc2023-02-27_18-08-54 etc.bak-.tar scripts [root@C8M-1 ~]# 创建临时文件夹:mktemp -d #创建临时目录 -p DIR或--tmpdir=DIR #指明临时文件所存放目录位置 mktemp -d [root@C8M-1 ~] mktemp -d /data/trashXXXX /data/trash3MIP [root@C8M-1 ~] ls /data/ 1.conf 2.txt 5.conf boot data etc2023-02-27_18-13-24 etc.tar testREVB.log 1.txt 3.conf a1.conf d1.log- dev etc.bak- f1.txt trash3MIP
示例:远程登录传输文件,自动输入系统密码;
[root@C8M-1 ~]# vim expect1 //实现非交互,将自动输入yes和密码; [root@C8M-1 ~]# cat expect1 #!/usr/bin/expect spawn scp /etc/redhat-release 10.0.0.120:/data expect { "yes/no" { send "yes\n";exp_continue } "password" { send "123456\n" } } expect eof [root@C8M-1 ~]# chmod +x expect1 //增加执行权限 [root@C8M-1 ~]# ./expect1 //执行expect文件 spawn scp /etc/redhat-release 10.0.0.120:/data The authenticity of host '10.0.0.120 (10.0.0.120)' can't be established. ECDSA key fingerprint is SHA256:D5vltyfGcEf1lQ+5RPKbD6ZCFVe0BHidNkJCPV/mHqM. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.0.0.120' (ECDSA) to the list of known hosts. root@10.0.0.120's password: redhat-release 100% 30 15.6KB/s 00:00 [root@C8M-1 ~]#
常见用法和使用示例:
用法:“nice [OPTION] [COMMAND [ARG]]”
**OPENTION选项:**
-n :指定进程的优先级级别,范围在 (-20--19)之间,-20为最高优先级,19为最低优先级;系统默认优先级为10.
-p:指定要调整优先级的进程ID;
-h:显示帮助用法信息
**COMMAND选项**:要执行的命令;
**ARG**:为命令的参数
示例:nice -n -10 command //提升进程优先级命令
[root@rocky8 ~]#nice -n -10 ping 127.0.0.1
[root@rocky8 ~]#ps axo pid,cmd,nice | grep ping //查看进程命令是否成功执行
1624 ping 127.0.0.1 -10
1659 grep --color=auto ping 0
[root@rocky8 ~]#nice -n 5 ping 127.0.0.1 //降低进程优先级
[root@rocky8 ~]#ps axo pid,cmd,nice |grep ping
1624 ping 127.0.0.1 -10
1662 ping 127.0.0.1 5
1670 grep --color=auto ping 0
用法:renice [-n] priority [[-p] pid ...]
使用进程ID调整优先级
示例:renice -n 10 -p 1234
[root@rocky8 ~]#renice -n -20 1624
1624 (process ID) old priority -10, new priority -20
[root@rocky8 ~]#ps axo pid,cmd,nice |grep ping
1624 ping 127.0.0.1 -20
1662 ping 127.0.0.1 5
[root@rocky8 ~]#prtstat 912 Process: dbus-daemon State: S (sleeping) CPU#: 0 TTY: 0:0 Threads: 2 Process, Group and Session IDs Process ID: 912 Parent ID: 1 Group ID: 912 Session ID: 912 T Group ID: -1 Page Faults This Process (minor major): 517 24 Child Processes (minor major): 0 0 CPU Times This Process (user system guest blkio): 0.35 0.19 0.00 0.03 Child processes (user system guest): 0.00 0.00 0.00 Memory Vsize: 87 MB RSS: 5726 kB RSS Limit: 18446744073709 MB Code Start: 0x55c2dfdf6000 Code Stop: 0x55c2dfe2cdb0 Stack Start: 0x7ffe0978fa90 Stack Pointer (ESP): 0 Inst Pointer (EIP): 0 Scheduling Policy: normal Nice: 0 RT Priority: 0 (non RT) [root@rocky8 ~]#
用法:ps [OPTIONS]
常用选项:
'aux' :显示进程的详细信息,包括其他用户的进程
'ef' :以进程树的形式显示进程信息。
'u':显示与进程相关的用户或者所有者的详细信息;
// ps aux :显示所有进程信息 [root@rocky8 ~]#ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.5 175148 13364 ? Ss 17:08 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 17 root 2 0.0 0.0 0 0 ? S 17:08 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 17:08 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 17:08 0:00 [rcu_par_gp] root 5 0.0 0.0 0 0 ? I< 17:08 0:00 [slub_flushwq] root 6 0.0 0.0 0 0 ? I 17:08 0:00 [kworker/0:0-events] root 7 0.0 0.0 0 0 ? I< 17:08 0:00 [kworker/0:0H-events_highpri] root 9 0.0 0.0 0 0 ? R 17:08 0:00 [kworker/u256:0-events_unbound] root 10 0.0 0.0 0 0 ? I< 17:08 0:00 [mm_percpu_wq] root 11 0.0 0.0 0 0 ? S 17:08 0:00 [rcu_tasks_rude_] root 12 0.0 0.0 0 0 ? S 17:08 0:00 [rcu_tasks_trace] root 13 0.0 0.0 0 0 ? S 17:08 0:00 [ksoftirqd/0] root 14 0.0 0.0 0 0 ? I 17:08 0:00 [rcu_sched] root 15 0.0 0.0 0 0 ? S 17:08 0:00 [migration/0] root 16 0.0 0.0 0 0 ? S 17:08 0:00 [watchdog/0] root 17 0.0 0.0 0 0 ? S 17:08 0:00 [cpuhp/0] root 18 0.0 0.0 0 0 ? S 17:08 0:00 [cpuhp/1] root 19 0.0 0.0 0 0 ? S 17:08 0:00 [watchdog/1] root 20 0.0 0.0 0 0 ? S 17:08 0:00 [migration/1] root 21 0.0 0.0 0 0 ? S 17:08 0:00 [ksoftirqd/1] root 23 0.0 0.0 0 0 ? I< 17:08 0:00 [kworker/1:0H-events_highpri] root 25 0.0 0.0 0 0 ? I 17:08 0:00 [kworker/u256:1-events_unbound] root 26 0.0 0.0 0 0 ? S 17:08 0:00 [kdevtmpfs] root 27 0.0 0.0 0 0 ? I< 17:08 0:00 [netns] root 28 0.0 0.0 0 0 ? S 17:08 0:00 [kauditd] ........ //ps ef 以进程树的形式显示进程信息; [root@rocky8 ~]#ps ef PID TTY STAT TIME COMMAND 1630 pts/1 SNs 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin SHELL=/bin/bash TERM=xterm SELINUX_ROLE_REQUESTED= SELINUX_LEVEL 1662 pts/1 TN 0:00 \_ ping 127.0.0.1 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30 1752 pts/1 RN+ 0:00 \_ ps ef LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30 1593 pts/0 Ss 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin SHELL=/bin/bash TERM=xterm SELINUX_ROLE_REQUESTED= SELINUX_LEVEL 1624 pts/0 T< 0:00 \_ ping 127.0.0.1 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30 1685 pts/0 T< 0:00 \_ ping 127.0.0.1 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30 1700 pts/0 S<+ 0:00 \_ ping 127.0.0.1 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30 // ps u:显示与进程相关的用户信息 [root@rocky8 ~]#ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1554 0.0 0.1 226080 5004 tty1 Ss+ 17:08 0:00 -bash root 1593 0.0 0.1 226080 4992 pts/0 Ss 17:08 0:00 -bash root 1624 0.0 0.0 242284 2424 pts/0 T< 17:11 0:00 ping 127.0.0.1 root 1630 0.0 0.1 226080 4984 pts/1 SNs 17:12 0:00 -bash root 1662 0.0 0.0 242284 2404 pts/1 TN 17:21 0:00 ping 127.0.0.1 root 1685 0.0 0.0 242284 2436 pts/0 T< 17:40 0:00 ping 127.0.0.1 root 1700 0.0 0.0 242284 2388 pts/0 S<+ 17:44 0:00 ping 127.0.0.1 root 1754 0.0 0.1 257432 3876 pts/1 RN+ 18:25 0:00 ps u [root@rocky8 ~]#
pstree用法‘pstree【options】’
常见选项: -p :显示进程的ID -a:显示进程的命令参数 -u:显示的所有者 -l:以长格式显示进程信息。 示例: [root@rocky8 ~]#pstree -u systemd─┬─NetworkManager───2*[{NetworkManager}] ├─anacron ├─atd ├─auditd─┬─sedispatch │ └─2*[{auditd}] ├─automount───5*[{automount}] ├─crond ├─dbus-daemon(dbus)───{dbus-daemon} ├─gssproxy───5*[{gssproxy}] ├─irqbalance───{irqbalance} ├─login───bash ├─lsmd(libstoragemgmt) ├─mcelog ├─polkitd(polkitd)───5*[{polkitd}] ├─rpc.statd(rpcuser) ├─rpcbind(rpc) ├─smartd ├─sshd─┬─sshd───sshd───bash───3*[ping] │ └─sshd───sshd───bash─┬─ping │ └─pstree ├─systemd───(sd-pam) ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}] [root@rocky8 ~]#pstree -l systemd─┬─NetworkManager───2*[{NetworkManager}] ├─anacron ├─atd ├─auditd─┬─sedispatch │ └─2*[{auditd}] ├─automount───5*[{automount}] ├─crond ├─dbus-daemon───{dbus-daemon} ├─gssproxy───5*[{gssproxy}] ├─irqbalance───{irqbalance} ├─login───bash ├─lsmd ├─mcelog ├─polkitd───5*[{polkitd}] ├─rpc.statd ├─rpcbind ├─smartd ├─sshd─┬─sshd───sshd───bash───3*[ping] │ └─sshd───sshd───bash─┬─ping │ └─pstree ├─systemd───(sd-pam) ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}] [root@rocky8 ~]#pstree -p systemd(1)─┬─NetworkManager(825)─┬─{NetworkManager}(829) │ └─{NetworkManager}(830) ├─anacron(1742) ├─atd(848) ├─auditd(790)─┬─sedispatch(792) │ ├─{auditd}(791) │ └─{auditd}(793) ├─automount(876)─┬─{automount}(885) │ ├─{automount}(886) │ ├─{automount}(887) │ ├─{automount}(908) │ └─{automount}(923) ├─crond(849) ├─dbus-daemon(823)───{dbus-daemon}(828) ├─gssproxy(840)─┬─{gssproxy}(841) │ ├─{gssproxy}(842) │ ├─{gssproxy}(843) │ ├─{gssproxy}(844) │ └─{gssproxy}(845) ├─irqbalance(818)───{irqbalance}(827) ├─login(851)───bash(1554) ├─lsmd(817) ├─mcelog(820) ├─polkitd(1346)─┬─{polkitd}(1355) │ ├─{polkitd}(1356) │ ├─{polkitd}(1366) │ ├─{polkitd}(1367) │ └─{polkitd}(1393) ├─rpc.statd(866) ├─rpcbind(788) ├─smartd(826) ├─sshd(834)─┬─sshd(1588)───sshd(1592)───bash(1593)─┬─ping(1624) │ │ ├─ping(1685) │ │ └─ping(1700) │ └─sshd(1625)───sshd(1629)───bash(1630)─┬─ping(1662) │ └─pstree(1758) ├─systemd(1544)───(sd-pam)(1547) ├─systemd-journal(649) ├─systemd-logind(821) ├─systemd-udevd(678) └─tuned(835)─┬─{tuned}(1345) ├─{tuned}(1357) ├─{tuned}(1369) └─{tuned}(1372) [root@rocky8 ~]#
1、索引数组使用整数作为索引来访问和操作数组元素,编号是从0开始递增,属于数值索引;
[root@C8M-1 ~]# student=(xiaoming dalong liuhua lifei) // 声明数组
[root@C8M-1 ~]# echo ${student[0]} //访问数组元素
xiaoming
[root@C8M-1 ~]# echo ${student[3]}
lifei
[root@C8M-1 ~]# echo ${student[2]}
liuhua
[root@C8M-1 ~]# student[2]="zhangfei" ///修改数组元素
[root@C8M-1 ~]# echo ${student[2]}
zhangfei
#遍历数组
for i in "${student[@]}";do
echo $i
done
2、索引可以支持使用自定义的格式,每个元素都有唯一的字符串键和对应的值,而不仅仅支持数值格式的索引即为关联索引,并且在使用前必须事先明数组后才可使用;
[root@C8M-1 ~]# declare -A name //声明数组
[root@C8M-1 ~]# name[teacher]=wang //数组赋值
[root@C8M-1 ~]# name[student]=liu
[root@C8M-1 ~]# echo ${name[teacher]} //查看数组元素
wang
[root@C8M-1 ~]# echo ${name[student]}
liu
[root@C8M-1 ~]#
[root@C8M-1 ~]# name[student]=wulaoer //修改数组元素
[root@C8M-1 ~]# echo ${name[student]}
wulaoer
3、高级变量使用通常是在shell脚本中使用特殊的变量来处理字符串,可以用于修改参数、替换命令等
# 参数扩展
filename="example.txt"
echo ${filename%.txt} # 输出: example
# 命令替换
date=$(date +%Y-%m-%d)
echo "Today is $date"
# 算术扩展
count=5
echo $((count + 2)) # 输出: 7
先使用for循环生成10个随机数,并将他们存储在名为‘numbers’的数组中,然后使用遍历数组来比较每个元素与当前的最大值和最小值并完成更新值,最后输出随机数数组和最大最小值的结果;
#!/bin/bash # 生成10个随机数并存储在数组中 declare -a numbers #数组声明 for ((i=0; i<10; i++)) do numbers[i]=$((RANDOM % 100)) #(0-99之间的随机数) done # 初始化最大值和最小值为数组中的第一个元素 max=${numbers[0]} min=${numbers[0]} # 遍历数组,找出最大值和最小值 for num in "${numbers[@]}" do if ((num > max)) then max=$num fi if ((num < min)) then min=$num fi done echo "随机数数组:${numbers[@]}" echo "最大值:$max" echo "最小值:$min"
[root@C8M-1 ~]# bash max_min2.sh
随机数数组:13 22 73 86 70 17 52 52 94 92
最大值:94
最小值:13
首先定义factorial
#!/bin/bash # 定义阶乘函数 factorial() { if (( $1 <= 1 )) then echo 1 else echo $(( $1 * $(factorial $(( $1 - 1 ))) )) fi } # 输入要计算阶乘的数字 read -p "请输入一个非负整数:" num # 调用阶乘函数并打印结果 result=$(factorial $num) echo "阶乘结果为:$result"
[root@C8M-1 ~]# bash factorical.sh
请输入一个非负整数:6
阶乘结果为:720
[root@C8M-1 ~]# bash factorical.sh
请输入一个非负整数:8
阶乘结果为:40320
线程是进程内的执行流程,共享进程的资源和上下文,可以实现更高效的并发执行,而进程是相对独立的环境,具有独立的资源和上下文,用于实现更高的安全性和隔离度
1. 进程控制块(PCB)是一个用于管理进程的数据结构,它包含了有关进程的各种信息和状态
2. 进程标识符(Process Identifier,PID):唯一标识进程的整数值。
3. 进程状态(Process State):表示进程当前的状态,如运行、就绪、等待等。
4. 进程优先级(Priority):用于调度进程的优先级信息。
5. 寄存器(Registers):包含进程的程序计数器(Program Counter)和其他寄存器的值,用于恢复进程的执行状态。
6. 内存管理信息:包括进程的地址空间、页表、堆栈信息等。
7. 文件描述符表(File Descriptor Table):用于管理进程打开的文件和文件描述符。
8. 进程间通信(IPC)信息:记录进程使用的各种通信机制,如管道、消息队列、信号量等。
9. 资源使用信息:包括进程使用的CPU时间、内存占用、打开文件数等统计信息。
10. 父子进程关系:记录进程的父进程和子进程的标识符。
11. 信号处理器(Signal Handler):记录进程针对不同信号的处理函数。
这些信息被保存在进程控制块中,操作系统利用这些信息来管理和调度进程。当进程被调度执行时,操作系统会从进程控制块中获取所需的信息,以便正确地运行和管理进程
1、加载代码:计算机启动时,引导加载程序(Bootloader)从启动设备(如硬盘)读取引导扇区中的引导代码。该引导代码负责初始化系统和加载操作系统。
2、操作系统加载:引导加载程序会加载操作系统的核心部分,通常是操作系统的内核。内核代码位于磁盘上的某个特定位置,加载到内存中,并开始执行。
3、初始化和启动:操作系统内核开始执行后,它会进行系统初始化,设置各种数据结构、驱动程序和其他必要的组件。然后,它会启动一个或多个用户空间进程,如初始化进程(init)。
4、用户空间进程创建和加载:初始化进程(init)是用户空间中的第一个进程,它负责启动其他用户空间进程。这些用户空间进程的代码和数据存储在磁盘上,操作系统会将其加载到内存中,并在适当的时候创建和执行这些进程。
5、代码执行:一旦进程被创建并加载到内存中,操作系统将控制权转移到该进程的代码。进程的代码将按照程序指令的顺序执行,从主函数(entry point)开始。
6、系统调用和库函数:在代码执行过程中,如果程序需要进行底层的操作(如文件操作、网络通信等),它会通过系统调用请求操作系统提供相应的服务。系统调用提供了一种从用户空间到内核空间的界面。
7、代码执行完毕或中断:当进程的代码执行完毕或者发生异常或中断时,操作系统将重新获得控制权。操作系统会根据调度算法决定是否继续执行当前进程,切换到另一个进程,或者将进程置于等待状态。
这个过程描述了在启动过程中加载并运行磁盘中的代码,包括操作系统和用户空间进程。具体的实现细节和步骤可能会因操作系统、硬件架构和配置而有所不同,但这个流程提供了一个基本的理解。
通过进程管理命令,你可以观察和管理运行在操作系统中的各个进程。这些命令可以提供关于进程的状态信息,包括进程的运行状态、优先级、PID(进程标识符)、父进程ID、内存使用等。以下是一些常见的进程状态: 运行状态(Running):进程当前正在执行或等待CPU分配时间片。在进程管理命令中,通常以 "R" 或 "S" 表示。 就绪状态(Runnable):进程已经准备好运行,但尚未获得CPU时间片分配。通常表示进程在等待系统调度执行。在进程管理命令中,通常以 "R" 或 "S" 表示。 等待状态(Waiting):进程正在等待某个事件发生,如等待IO操作完成、等待某个信号、等待资源可用等。在进程管理命令中,通常以 "D" 表示。 停止状态(Stopped):进程暂停执行,等待外部条件触发后恢复执行。进程可以通过信号被停止,如Ctrl+Z发送的SIGTSTP信号。在进程管理命令中,通常以 "T" 表示。 僵尸状态(Zombie):进程已经终止,但其进程描述符仍然存在,等待父进程回收其资源。僵尸进程通常是由于父进程没有正确处理子进程终止信号造成的。在进程管理命令中,通常以 "Z" 表示。 除了以上常见的状态,还有一些其他的状态,如睡眠状态(Sleeping)和僵尸子进程(Defunct)。具体的进程状态可以根据不同的操作系统和命令输出而有所不同。 一些常用的进程管理命令包括: ps:显示系统中的进程状态信息。 top:实时显示系统中的进程列表和系统状态。 htop:一个交互式的进程查看器,显示系统中的进程和资源使用情况。 kill:发送信号给指定进程,可以用来终止、暂停或恢复进程。 nice:修改进程的优先级. renice:修改已运行进程的优先级。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。