N77-第四周作业

发布时间 2023-07-03 17:36:51作者: 骄骄爹地

N77-第四周作业

1. 自定义写出10个定时任务的示例

安装周期性计划任务cron

[15:35:22 root@ljhtxy-centos ~]#yum -y install cron

开启crond服务

[15:35:22 root@ljhtxy-centos ~]#systemctl enable --now crond.service

查看crond服务状态

[15:43:22 root@ljhtxy-centos ~]#systemctl status crond.service 
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2023-06-29 00:20:38 CST; 3 days ago
 Main PID: 1204 (crond)
   CGroup: /system.slice/crond.service
           └─1204 /usr/sbin/crond -n

Jun 29 00:20:38 ljhtxy-centos systemd[1]: Started Command Scheduler.
Jun 29 00:20:38 ljhtxy-centos crond[1204]: (CRON) INFO (RANDOM_DELAY will be scaled with fac...d.)
Jun 29 00:20:38 ljhtxy-centos crond[1204]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.

查看系统cron的配置格式:cat /etc/crontab

[15:44:46 root@ljhtxy-centos ~]#cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

注意:

(1) 每一行定义一个周期性任务,共7个字段;

* * * * * : 定义周期性时间

user-name : 运行任务的用户身份

command to be executed:任务

(2) 此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义PATH环境变量;

(3) 执行结果邮件发送给MAILTO指定的用户

用户cron配置格式

  • 使用命令crontab -e

    [15:28:09 root@ljhtxy-centos data]#crontab -e
    
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    MAILTO=root
    # 1.每4小时备份一次/etc目录至/data/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH”
    0 */4 * * * cp -a /etc /data/backup/etc-`date +'%F-%H'` > /dev/null
    
    # 2.每周2, 4, 7备份/var/log/messages文件至/data/logs目录中,文件名形如“messages-yyyymmdd”
    0 8 * * 2,4,0 cp -a /var/log/messages /data/logs/messaages-`date +'%Y%m%d'` > /dev/null
    
    # 3.每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/data/tmp/meminfo.txt文件中
    20 */2 * * * grep -e '^S' -e '^M' /proc/meminfo >> /data/tmp/meminfo.txt
    
    # 4.工作日时间内,每两小时执行一次“ip addr show”命令
    0 9-17/2 * * 1-5 ip addr show >> /data/ip.log
    
    # 5.执行目录下的所有脚本并每一分钟执行一次
    * * * * * root run-parts /home/cron
    
    # 6.执行目录下的指定脚本。
    * * * * * root /home/cron/test.sh
    
    # 7.每天7:50开启ssh服务
    50 7 * * * systemctl start sshd
    
    # 8.每天22:50关闭ssh服务
    50 22 * * * systemctl stop sshd
    
    # 9.在12月内,每天的早上6点到12点,每隔3个小时0分钟执行一次/usr/bin/backup
    0 6-12/3 * 12 * /usr/bin/backup
    
    # 10.周一到周五每天下午5:00寄一封信给alex@domain.name
    0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
    
    

2.图文并茂说明Linux进程和内存概念

进程的概念

进程(process)是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps 命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空 间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为 多个进程实体。操作系统中所有进程实体共享着计算机系统的CPU、外设等资源。

进程状态

Linux是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必 然会产生多进程,而每个进程会有不同的状态。Linux的进程有以下6种状态:

D = uninterruptible sleep D:不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号;不可中断 的等待状态最典型的例子就是进程等待磁盘I/O操作
R = running R:进程处于运行态或就绪状态,只有在该状态的进程才可能在CPU上运行。而同 一时刻可能有多个进程处于可执行状态;
S = sleeping S:可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂 起。;这类进程处于阻塞状态,一旦达到某种条件,就会变为运行状态。同时该状态 的进程也会由于接收到信号而被提前唤醒进入到运行状态。
T = stopped by job control signal T:暂停状态或跟踪状态;进 向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于ASK_UNINTERRUPTIBLE状态而不响应信号)向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
X=TASK_DEAD - EXIT_DEAD X:退出状态,进程即将被销毁
Z = zombie Z:退出状态,进程成为僵尸进程

img

img

Linux系统使用ps -aux命令时可观察到进程的当前状态

[16:06:49 root@ljhtxy-centos dev]#ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  43608  4064 ?        Ss   Jun29   0:38 /usr/lib/systemd/systemd --switch
root         2  0.0  0.0      0     0 ?        S    Jun29   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Jun29   0:05 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    Jun29   0:01 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Jun29   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    Jun29   1:26 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S<   Jun29   0:00 [lru-add-drain]
root        11  0.0  0.0      0     0 ?        S    Jun29   0:01 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    Jun29   0:01 [watchdog/1]
root        13  0.0  0.0      0     0 ?        S    Jun29   0:01 [migration/1]
root        14  0.0  0.0      0     0 ?        S    Jun29   0:04 [ksoftirqd/1]
root        16  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kworker/1:0H]
root        18  0.0  0.0      0     0 ?        S    Jun29   0:00 [kdevtmpfs]
root        19  0.0  0.0      0     0 ?        S<   Jun29   0:00 [netns]
root        20  0.0  0.0      0     0 ?        S    Jun29   0:00 [khungtaskd]
root        21  0.0  0.0      0     0 ?        S<   Jun29   0:00 [writeback]
root        22  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kintegrityd]
root        23  0.0  0.0      0     0 ?        S<   Jun29   0:00 [bioset]
root        24  0.0  0.0      0     0 ?        S<   Jun29   0:00 [bioset]
root        25  0.0  0.0      0     0 ?        S<   Jun29   0:00 [bioset]
root        26  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kblockd]
root        27  0.0  0.0      0     0 ?        S<   Jun29   0:00 [md]
root        28  0.0  0.0      0     0 ?        S<   Jun29   0:00 [edac-poller]
root        29  0.0  0.0      0     0 ?        S<   Jun29   0:00 [watchdogd]
root        36  0.0  0.0      0     0 ?        S    Jun29   0:00 [kswapd0]
root        37  0.0  0.0      0     0 ?        SN   Jun29   0:00 [ksmd]
root        38  0.0  0.0      0     0 ?        SN   Jun29   0:00 [khugepaged]
root        39  0.0  0.0      0     0 ?        S<   Jun29   0:00 [crypto]
root        47  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kthrotld]
root        49  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kmpath_rdacd]
root        50  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kaluad]
root        51  0.0  0.0      0     0 ?        S<   Jun29   0:00 [kpsmoused]
root        52  0.0  0.0      0     0 ?        S<   Jun29   0:00 [ipv6_addrconf]
root        65  0.0  0.0      0     0 ?        S<   Jun29   0:00 [deferwq]
root       107  0.0  0.0      0     0 ?        S    Jun29   0:06 [kauditd]
root       202  0.0  0.0      0     0 ?        S<   Jun29   0:00 [iscsi_eh]
root       258  0.0  0.0      0     0 ?        S<   Jun29   0:00 [ata_sff]
root       262  0.0  0.0      0     0 ?        S    Jun29   0:00 [scsi_eh_0]
root       263  0.0  0.0      0     0 ?        S<   Jun29   0:00 [scsi_tmf_0]
root       264  0.0  0.0      0     0 ?        S    Jun29   0:00 [scsi_eh_1]
root       265  0.0  0.0      0     0 ?        S<   Jun29   0:00 [scsi_tmf_1]
root       266  0.0  0.0      0     0 ?        S<   Jun29   0:00 [ttm_swap]
root       274  0.0  0.0      0     0 ?        S<   Jun29   0:02 [kworker/1:1H]
root       281  0.0  0.0      0     0 ?        S<   Jun29   0:17 [kworker/0:1H]
root       291  0.0  0.0      0     0 ?        S    Jun29   0:53 [jbd2/vda1-8]
root       292  0.0  0.0      0     0 ?        S<   Jun29   0:00 [ext4-rsv-conver]
root       387  0.0  3.2 125340 66000 ?        Ss   Jun29   1:09 /usr/lib/systemd/systemd-journald
root       408  0.0  0.1  45764  2232 ?        Ss   Jun29   0:00 /usr/lib/systemd/systemd-udevd
root       410  0.0  0.0 116644  1272 ?        Ss   Jun29   0:00 /usr/sbin/lvmetad -f
root       609  0.0  0.0  55532  1088 ?        S<sl Jun29   0:14 /sbin/auditd
dbus       646  0.0  0.1  60304  2508 ?        Ss   Jun29   0:38 /usr/bin/dbus-daemon --system --a
chrony     648  0.0  0.0 100496  1580 ?        S    Jun29   0:00 /usr/sbin/chronyd
polkitd    655  0.0  0.6 614452 12296 ?        Ssl  Jun29   0:11 /usr/lib/polkit-1/polkitd --no-de
root       656  0.0  0.0  26516  1932 ?        Ss   Jun29   0:16 /usr/lib/systemd/systemd-logind
libstor+   657  0.0  0.0   8580   840 ?        Ss   Jun29   0:01 /usr/bin/lsmd -d
root       669  0.0  0.0   4388   544 ?        Ss   Jun29   0:00 /usr/sbin/acpid
root       935  0.0  0.1 103004  2388 ?        Ss   Jun29   0:00 /sbin/dhclient -q -lf /var/lib/dh
root       999  0.0  0.9 574292 19532 ?        Ssl  Jun29   0:32 /usr/bin/python2 -Es /usr/sbin/tu
root      1001  0.0  0.4  61488 10148 ?        S<Ls Jun29   0:00 /sbin/iscsid -f
named     1008  0.0  5.2 310176 106504 ?       Ssl  Jun29   0:00 /usr/sbin/named -u named -c /etc/
root      1182  0.0  0.2 433848  5668 ?        Ssl  Jun29   0:04 /usr/sbin/automount --systemd-ser
root      1184  0.0  1.9 732576 40280 ?        Ssl  Jun29   0:39 /usr/sbin/rsyslogd -n
root      1194  0.0  0.2 113000  4336 ?        Ss   Jun29   0:14 /usr/sbin/sshd -D
root      1196  0.0  0.0  25908   960 ?        Ss   Jun29   0:00 /usr/sbin/atd -f
root      1204  0.0  0.0 126424  1660 ?        Ss   Jun29   0:02 /usr/sbin/crond -n
root      1217  0.0  0.3  29456  6476 ?        Sl   Jun29   0:57 /usr/local/qcloud/tat_agent/tat_a
root      1218  0.0  0.0  20584   616 ?        Ss   Jun29   0:00 nginx: master process /usr/local/
nobody    1231  0.0  0.0  23112  1620 ?        S    Jun29   0:00 nginx: worker process
root      1396  0.0  0.0 110208   860 tty1     Ss+  Jun29   0:00 /sbin/agetty --noclear tty1 linux
root      1397  0.0  0.0 110208   868 ttyS0    Ss+  Jun29   0:00 /sbin/agetty --keep-baud 115200,3
root      1487  0.0  1.6 372276 33216 ?        Sl   Jun29   0:02 /www/server/panel/pyenv/bin/pytho
root      1541  0.0  1.9 1260268 39460 ?       Sl   Jun29   3:46 /www/server/panel/pyenv/bin/pytho
root      1650  0.0  0.0  97404  1864 ?        Sl   Jun29   0:03 /usr/local/qcloud/stargate/bin/sg
root      1685  0.0  0.3 155396  7548 ?        S    Jun29   0:04 barad_agent
root      1692  0.0  0.4 164948  9464 ?        S    Jun29   5:03 barad_agent
root      1693  0.6  0.7 753848 14764 ?        Sl   Jun29  41:52 barad_agent
root      1717  0.0  0.8 1054112 16408 ?       Sl   Jun29   1:42 /usr/local/qcloud/YunJing/YDLive/
root      1952  0.9  2.4 1038920 50644 ?       Sl   Jun29  67:14 /usr/local/qcloud/YunJing/YDEyes/
root      2049  0.0  0.8 1092040 17988 ?       Sl   Jun29   1:15 /bin/sh -c sleep 100
root      4210  0.0  0.0      0     0 ?        S    15:55   0:00 [kworker/1:2]
root     11887  0.0  0.0      0     0 ?        S    16:25   0:00 [kworker/0:1]
root     13070  0.0  0.0      0     0 ?        S    16:30   0:00 [kworker/1:0]
root     13105  0.0  0.0      0     0 ?        S    16:30   0:00 [kworker/0:0]
root     14300  0.0  0.0      0     0 ?        R    16:35   0:00 [kworker/0:2]
root     14649  0.0  0.0      0     0 ?        S    Jun30   0:03 [kworker/u4:1]
root     14725  0.0  0.0 155452  1872 pts/1    R+   16:36   0:00 ps aux
root     25683  0.0  0.0      0     0 ?        S    Jul02   0:00 [kworker/u4:0]
root     29245  0.0  0.2 156876  5476 ?        Ss   15:25   0:00 sshd: root@pts/0
root     29247  0.0  0.1 116840  3504 pts/0    Ss+  15:25   0:00 -bash
root     30193  0.0  0.2 156876  5472 ?        Ss   15:29   0:00 sshd: root@pts/1
root     30209  0.0  0.1 116840  3580 pts/1    Ss   15:29   0:00 -bash

当一个进程调用 fork 函数生成另一个进程,原进程就称为父进程新生成的进程 则称为子进程。 Linux 系统中这样父子进程非常多,我们可以使用 pstree 命令查看系统上的进程 「谱系」。

[16:39:45 root@ljhtxy-centos dev]#pstree 
systemd─┬─BT-Panel───{BT-Panel}
        ├─BT-Task───12*[{BT-Task}]
        ├─YDLive─┬─YDService─┬─sh───8*[{sh}]
        │        │           └─22*[{YDService}]
        │        └─8*[{YDLive}]
        ├─acpid
        ├─2*[agetty]
        ├─atd
        ├─auditd───{auditd}
        ├─automount───4*[{automount}]
        ├─barad_agent─┬─barad_agent
        │             └─barad_agent───3*[{barad_agent}]
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─dhclient
        ├─iscsid
        ├─lsmd
        ├─lvmetad
        ├─named───4*[{named}]
        ├─nginx───nginx
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sgagent───{sgagent}
        ├─sshd─┬─sshd───bash
        │      └─sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tat_agent───8*[{tat_agent}]
        └─tuned───4*[{tuned}]

进程和内存

进程可以简单理解为一个二进制程序进入内核,而后变成了执行程序:进程。因此,进程是一定占据部分内存的,但是进程对内存的管理方式不一,但大致分为静态和动态的分配和统一回收。

img

简单概括,进程中包含内存,而进程中的内存分配可拆分如下所示:

  1. 栈:存放程序临时创建的局部变量
  2. 堆:存放进程运行中被动态分配的内存段
  3. BSS:BSS段包含了程序中未初始化的全局变量,在内存中 bss段全部置零
  4. 数据段:存放可执行文件中已初始化全局变量
  5. 代码段:存放可执行文件的操作指令

3. 图文并茂说明Linux启动流程

1、BIOS 阶段

在系统加电检测结束以后,由BIOS中的代码负责把引导器加载进入机器的内存中,控制权交给引导器。

2、Loader阶段

引导器负责确定Linux内核的位置,把Linux内核加载进入内存中;同时,确定文件系统的位置,将根文件系统的镜像加载进入内存中。然后在加载内核的时候给内核传入一些启动参数,用于控制内核执行过程中的一些行为,接下来将控制权交给内核。

3、Kernel阶段

内核接管控制权以后,首先解压缩自己,检测设备,加载内部模块。然后根据启动参数挂载根文件系统。挂载完根文件系统后内核启动的第1个进程是init,默认的位置为“/sbin/init”。如果找不到这个可执行文件,就转而启动“/bin/sh”,提供给用户一个人机交互的界面。

4、init进程阶段

init进程启动后查找的第1个配置文件 硬件资源是“/etc/inittab”,这个文件控制 init 的行动。一般 init 会首先指定启动等级,然后执行“/etc/ 加载 init进程rc.d/rc.sysinit”,同时 rc.sysinit-启动脚本启动系统服务进程(如 update、syslogd等)、网络和必要的环境变量设置。最后inittab会指定init进程去 调用getty打开多个终端控制台,每个终端控制台会执行login,从而出现“login:”的提示符。整 个Linux系统启动完成,下图为Linux系统启动流程。
img

4. 自定义一个systemd服务定时去其他服务器上检查/tmp/下文件的个数,如果发现数量有变化就记录变化情况到文件中。

vim /lib/systemd/system/find.service

[Unit]
Description=check tmp
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c  "ssh root@192.168.50.131  sh /shell/check_tmp.sh"   #基于key验证
ExecStop=ps auxf | grep [check]_tmp.sh |awk '{print $2}' |xargs kill -9 2>/dev/null
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
Wantedby=multi-user.target


systemctl daemon-reload
systemctl enable --now find.service

5. 写Linux内核编译安装博客

Linux源代码下载

下载源代码官网下载,地址为:https://www.kernel.org/

下载历史版本,点击网页上的https://www.kernel.org/pub/,然后选择Linux,kernel

配置Linux内核

将下载好的源代码解压,这里我下载的是linux-4.11.tar.xz,解压输入

tar xvJf  linux-4.11.tar.xz

解压之后开始配置内核模块,选择自己芯片的硬件架构,选择自己需要哪些驱动模块等等,配置为指令make config或者 make menuconfig,前者是基于问答式的配置,使用不方便,后者是菜单式的配置,较为直观和方便,这里使用后者,输入

make menuconfig

选择后面的load加载配置文件,输入上面文件的名字,点ok,然后再点击保存,保存文件名为.config

编译内核

编译内核需要生成映像文件和模块文件,映像文件由配置中的选择为<*>的文件编译链接而成,开机后直接加载在内存中运行

模块文件将选择为的文件编译成.o文件,放在磁盘中,以备后来要用到,先配置映像文件,输入

#make bzImage

开始生成bzImage映像文件,需要10多分钟左右,正常情况下不会有什么问题,编译完成后提示bzImage文件在 arch/x86/boot 目录下

然后编译模块文件,输入

#make modules

大概需要50分钟左右,应该也不会有什么问题,可能会有一些警告,可以忽视,然后把散落在各个文件夹下的.o文件组装起来,输入

#make modules_install

组装完成后,会把文件放在/lib/modules/ 下,文件名为对应的版本号,查看可以输入

#ls /lib/modules

可以看到对应版本的文件夹

然后把存放模块文件的目录打包成一个文件,使用mkinitrd命令,输入(主要后者不要输入成/lib/modules/4.11.0)

#mkinitrd  rd-4.11.0  4.11.0

前者为生成文件的名字,后者为模块文件存在的目录,需要几分钟,这样文件包rd-4.11.0就在当前文件目录上产生了。

安装内核

安装内核之前需要把生成的bzImage和模块文件包rd-4.11.0拷贝到/boot目录下,这样启动的时候才能够选择这个内核启动

先拷贝bzImage,输入(如#cp arch/\(cpu/boot/bzImage /boot/vmlinux-\)version )

#cp arch/x86/boot/bzImage  /boot/vmlinuz-4.11.0

然后拷贝模块文件包,输入cp rd-$version /boot/,version为对应版本号

#cp  rd-4.11.0  /boot/

然后修改/etc/grub.conf,才可以在启动时选择这个新内核,输入

#vi  /etc/grub.conf

赋值倒数后面的4行,输入4yy,然后拷贝到最后,输入p,修改成如下的样子
img

启动

输入重启,然后在开机倒计时的时候按下回车,选择新的版本,启动的时候有点久。

这样就成功的把内核升级了,虽然在操作的时候好像没什么变化,可以查看当前的内核版本,输入

#uname -r

显示的应该是最新的版本号,这样内核就升级成功了,对应的开发板的内核制作也是和这个差不多。

6. 总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个。

[17:24:40 root@ljhtxy-centos etc]#awk -F ':' '{print $1,$2,$3}' OFS="\t" passwd
root	x	0
bin	x	1
daemon	x	2
adm	x	3
lp	x	4
sync	x	5
shutdown	x	6
halt	x	7
mail	x	8
operator	x	11
games	x	12
ftp	x	14
nobody	x	99
systemd-network	x	192
dbus	x	81
polkitd	x	999
libstoragemgmt	x	998
rpc	x	32
ntp	x	38
abrt	x	173
sshd	x	74
postfix	x	89
chrony	x	997
tcpdump	x	72
syslog	x	996
www	x	1000
lighthouse	x	1001
lijinhua	x	1002
named	x	25