Shell脚本高级命令

本文介绍了Linux系统中的Shell脚本高级命令,如trap用于捕获信号,install用于安装和设置权限,mktemp创建临时文件,以及expect自动执行交互式应用程序。此外,还讲解了进程优先级命令nice和renice,以及进程管理工具如ps、pstree、prstat等,用于监控和管理系统进程。文章还展示了如何使用这些工具进行进程状态查看和优先级调整。
摘要由CSDN通过智能技术生成

第四周

一、Shell脚本高级命令总结:trap、install、mktemp、expect;进程优先级命令:nice、renice;进程管理工具:ps、pstree、prtstat、pgrep、pidof、uptime、mpstat、top、htop、free、pmap、vmstat、iostat、iotop、iftop、

1. shell高级命令
1.1、trap:用于在脚本执行期间捕获和处理信号,信号可以是由操作系统其他进程发送的中断、终止或者其他的事件,可以使用trap捕获信号并在退出脚本之前执行一些清理;
trap 常见命令
trap '触发指令' 信号 ///将执行自定义信号,不会执行原操作
trap '' 信号  //忽略信号操作
trap '-' 信号 //#恢复原信号的操作
trap -p  //#列出自定义信号操作
trap finish EXIT  //#当脚本退出时,执行finish函数

1.2、install:可用于安装软件包或者脚本、复制文件并在一个步骤中设置权限,如果目录不存在的话该命令也可以创建目录;

常见选项:
-m MODE,默认755 -o OWNER -g GROUP -d DIRNAME 目录

示例:将file.txt文件复制到’/data中‘,并更改其权限; install -m 644 file.txt /data

1.3、mktemp:用于创建具有唯一名称的临时文件或者目录,在需要创建临时使用并在脚本完成运行时应删除的文件或目录时,该命令很有用,mktemp可以用于通过设置适当的权限来创建安全的临时文件或者目录;
[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
1.4、expect:主要用于自动执行交互式应用程序,允许在编写时与需要用户输入的应用程序的交互脚本,例如,可以使用expect通过在脚本中提供用户名和密码来自动执行ssh登录过程;适用于需要对多台服务器执行相同的操作环境中,可以提高工作效率;

示例:远程登录传输文件,自动输入系统密码;

[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 ~]#
2、进程优先级命令
2.1、nice:可以设置进程的优先级,可用于增加或者降低进程的优先级来影响在系统中的执行顺序,较低的优先级值表示更高的优先级。
常见用法和使用示例:
用法:“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


2.2、renice:可以对正在执行中的进程调整优先级,可以增加或者降低进程的优先级。
用法: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
3、进程管理工具
2.1、prtstat+进程:可以查看进程中的详细信息,包括进程名、编号、状态,优先级和占用信息等信息;
[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 ~]#

2.2、ps、pstree:可以用于查看和管理系统重的进程信息
用法: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

三、求10个随机数的最大值与最小值。

先使用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、资源占用:每个进程都有独立的地址空间,包括代码段、数据段和堆栈,而线程与其所属的进程共享相同的地址空间,所以创建和销毁线程比创建和销毁进程更加方便,线程之间的切换开销也较小。
2、调度和执行:进程是调度的基本单位,操作系统以进程为单位进行调度和分配资源,线程是在进程内部调度执行的,因为不需要切换地址空间,所以线程之间的切换速度更快。
3、通信和同步:进程之间的通信需要使用进程间通信机制,如管道、信号、共享内存等,线程之间共享同一进程的地址空间,可以通过共享变量进行通信,同时可以使用线程同步机制,如条件变量来保护共享数据;
4、安全性:因为线程共享进程的地址空间,所以线程之间对同一资源的访问需要同步进行,以避免数据竞争和并发访问等问题,进程之间的资源隔离更高,因此更容易实现安全性;
5、效率:由于线程的创建和切换开销较小,所以线程在并发执行和多核处理器上能够更好地利用系统资源,提高执行效率,进程的创建和切换开销较大,因此在多线程的场景下通常比进程更加高效;

六、解析进程的结构。

每个进程都有一个数据结构表示其状态和属性。这个数据结构通常称为进程控制块(Process Control Block,PCB),也被称为任务结构(Task Structure)或进程描述符(Process Descriptor)。
 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:修改已运行进程的优先级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值