学习周报-20221216

文章目录

  • 一 centos6和centos7系统的服务启动与关闭
  • 二 Linux下的/etc/pam.d/system-auth配置文件参数
    • 各列参数说明
      • 1)第一列
      • 2)第二列
      • 3)第三列和第四列
    • 常用类说明
  • 三 Linux用户密码过期策略
    • 一 相关文件
    • 二 修改密码
    • 三 设置密码过期策略
  • 四 Linux中使用scp(复制)、sftp(复制)、rsync(同步)在系统间传输文件
    • 一 环境准备
    • 二 scp使用
      • 2.1 检查SSH服务
      • 2.2 传输文件
      • 2.3 检查文件
      • 2.4 参数说明
    • 三 sftp使用
      • 3.1 将文件上传至远端
      • 3.2 将远端文件下载至本地
    • 四 rsync使用
      • 4.1 检查命令
      • 4.2 传输文件
      • 4.3 检查结果
      • 4.4 传输目录
      • 4.5 常用参数说明
  • 五 http 常见状态码
    • 一 状态码
    • 二 原因划分
    • 三 具体含义
  • 六 sed命令常用方法
    • 一 常用参数
    • 二 搭建测试环境
    • 三 用法说明
      • 3.1 显示输出信息
      • 3.2 添加信息
      • 3.3 删除信息
      • 3.4 修改信息
      • 3.5 真正在文件中修改内容
    • 四 补充说明
  • 七 Linux进程优先级
    • 一 定义描述
    • 二 查看nice值
      • 2.1 使用top命令交互式查看nice值
      • 2.2 使用ps命令查看nice值
      • 2.3 查看程序调度策略
    • 三 修改nice值
      • 3.1 启动特定nice值的进程
      • 3.2 更改现有进程的nice级别

一 centos6和centos7系统的服务启动与关闭

centos6 centos7
启动服务 service <服务名> start systemctl start <服务名>
关闭服务 service <服务名> stop systemctl stop <服务名>
开机启动服务 chkconfig <服务名> on systemctl enable <服务名>
开机不启动服务 chkconfig <服务名> off systemctl disable <服务名>
重启服务 service <服务名> restart systemctl restart <服务名>

二 Linux下的/etc/pam.d/system-auth配置文件参数

首先打开配置文件/etc/pam.d/system-auth,我们会发现这个文件大致分成四列四部分内容。

[root@master ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

各列参数说明

1)第一列

其中第一列包括 auth、account、password、session四个模块。

参数 释义
auth 用来识别用户身份,比如提示用户输入密码,判断用户是否为root等
account 检测账户是否允许访问。比如是否允许登录,是否达到最大用户数,root用户是否允许在这个终端登录等
password 进行用户信息更新,一般指修改用户密码
session 用来配置和管理用户会话,定义用户登陆前与退出后的操作

2)第二列

第二列包含 required requisite suffifient optinal 四个参数。

参数 释义
required 该模块失败后,也会执行完其余的模块,最后才会返回错误信息
requisite 该模块必须success才能使认证继续进行,失败后直接返回错误信息,不执行后面的模块
sufficient 如果失败则忽略;如果成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块
optional 忽略结果,不管成功或者失败
include 与处理结果无关,直接引用其他PAM模块的配置参数

3)第三列和第四列

具体使用的类以及参数设置。

常用类说明

1)密码过期,要求强制修改密码,且必须满足密码的复杂度。
此处使用 pam_cracklib.so 这个类。

password  required  pam_cracklib.so enforce_for_root retry=a ...

下面是我们常用的参数以及含义解释。

参数 含义
enforce_for_root 即使是root用户,也必须符合复杂度条件
retry=a 提示a次用户密码错误输入
minlen=b 密码长度不小于b个字符
ucredit=c 至少有c个大写字母
lcredit=d 至少有d个大写字母
dcredit=e 至少有e个数字
ocredit=f 至少有f个其他特殊字符
difok=g 新密码中至少有g个字符和旧密码不同

上面的cdef数字是小于0的数字时,表示要求最少需要几个。
当cdef数字是大于0的数字时,表示要求最多有几个。
比如lcredit=-3,表示最少要有3个小写字母。
比如dcredit=2,表示最多只能有2个数字。

下面是其他一些常用的类以及对应的模块。

类可用的模块 含义说明
pam_unix.so auth 提示用户输入密码,并与/etc/shadow对比,匹配则返回0
pam_unix.so account 检查用户账号信息,账号可用,返回0
pam_unix.so password 修改用户的密码,并将其更新到/etc/shadow文件中
类可用的模块 含义说明
pam_shells.so auth 如果用户想登陆系统,它的shell必须是 /etc/shells文件中的shell
类可用的模块 含义说明
pam_deny.so auth 用于拒绝访问
pam_deny.so account 用于拒绝访问
pam_deny.so password 用于拒绝访问
类可用的模块 含义说明
pam_permit.so auth 模块任何时候都返回成功
pam_permit.so account 模块任何时候都返回成功
pam_permit.so password 模块任何时候都返回成功
类可用的模块 含义说明
pam_securetty.so auth 当用户以root登录时,登陆的tty 必须在 /etc/securetty 中
类可用的模块 含义说明
pam_listfile.so auth 访问应用程序的控制开关
pam_listfile.so account 访问应用程序的控制开关
pam_listfile.so password 访问应用程序的控制开关
pam_listfile.so session 访问应用程序的控制开关
类可用的模块 含义说明
pam_limits.so session 定义使用系统资源的上限,包括root用户。可以通过 /etc/security/limits.conf 设置

三 Linux用户密码过期策略

一 相关文件

文件 作用
/etc/passwd 存放用户信息
/etc/shadow 存放用户密码
/etc/group 存放用户组信息
/etc/gshadow 存放/etc/group的加密信息

首先解释 /etc/passwd 文件下的各列信息含义

[oldboy@master ~]$ sudo tail -5 /etc/passwd
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
列数 名称 含义
1 username UID到名称的一种映射
2 password 以前是存放密码的位置,现在存放在/etc/shadow
3 UID 用户ID,最基本的级别标识用户的编号
4 GID 用户主要组的ID编号
5 GECOS 任意文本,一般是用户的姓名
6 /home/dir 用户个人数据和配置文件的存放目录
7 shell 用户登录时运行的程序,一般提供命令提示符

其次是 /etc/shadow 文件中各列信息的含义。

[oldboy@master ~]$ sudo tail -5 /etc/shadow
[sudo] password for oldboy: 
avahi:!!:19323::::::
postfix:!!:19323::::::
ntp:!!:19323::::::
tcpdump:!!:19323::::::
oldboy:$6$pO.iG1Bl3a8RS/k5$DSHXmE7Klnsnn4ys7KVWolPAlCrgJi1rM/sAigFA.e4JurEdfpp65k6gsuyxMIj/aDXlUsmXcphCRAbeOUCqo0:19323:0:99999:7:::
列数 名称 含义
1 name 系统的有效账户名
2 password 已加密的密码;如果是感叹号,表示密码已经被锁定
3 lastchange 最近一次更改密码的日期,表示为距离1970年1月1日的天数
4 minage 可以更改密码前的最短天数,0则表示“无最短期限要求”
5 maxage 必须更改密码前的最多天数
6 warning 密码即将到期的警告期
7 inactive 账户在密码到期后保持活跃的天数,此时账户仍可登录和修改密码;天数过后,账户锁定
8 expire 账户到期日期,表示为距离1970年1月1日的天数
9 blank 空白字段,供未来使用

二 修改密码

passwd 用户名

三 设置密码过期策略

使用chage命令设置密码过期策略。

首先创建一个用户tom

[root@master ~]# useradd tom
[root@master ~]# id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom)

然后给用户添加密码为123456

[root@master ~]# passwd tom
Changing password for user tom.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

此时查看tom的密码过期策略

[root@master ~]# chage -l tom
Last password change                                    : Dec 12, 2022
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

首先设置tom在下一次登陆时,强制修改密码

[root@master ~]# chage -d 0 tom

接着设置用户将在180天后过期

[root@master ~]# date -d "+180 days"
Sat Jun 10 14:50:18 CST 2023
[root@master ~]# chage -E 2023-06-10 tom

再设置,包括tom在内的所有用户必须最多30天,要修改一次密码

[root@master ~]# cat /etc/login.defs|grep '^PASS_MAX'
PASS_MAX_DAYS   30

最后,突然反悔,希望仅设置tom用户最迟每10天修改一次密码
并将对tom用户的密码策略修改内容进行打印。

[root@master ~]# chage -M 10 tom
[root@master ~]# chage -l tom
Last password change                                    : password must be changed
Password expires                                        : password must be changed
Password inactive                                       : password must be changed
Account expires                                         : Jun 10, 2023
Minimum number of days between password change          : 0
Maximum number of days between password change          : 10
Number of days of warning before password expires       : 7

四 Linux中使用scp(复制)、sftp(复制)、rsync(同步)在系统间传输文件

一 环境准备

主机名master:10.0.0.10 文件传输方
主机名node1: 10.0.0.11 文件接收方

说明:
scp与sftp作为运行SSH服务的远程系统来回传输文件的安全方式,是将远程文件进行复制到另一个系统。在使用scp与sftp之前,需要能够完成ssh远程连接。
rsync命令则用来同步不同系统的文件。它与scp的区别在于,如果两个系统的文件或目录有差异,rsync只复制差异部分,而scp则复制全部内容。

二 scp使用

2.1 检查SSH服务

可以直接查看sshd的端口22是否被监听

[root@master .ssh]# netstat -lntup|grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6940/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      6940/sshd  

也可以使用systemctl命令检查sshd服务的启动状态

[root@master .ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-12-10 00:03:13 CST; 3 days ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 6940 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           └─6940 /usr/sbin/sshd -D

2.2 传输文件

使用scp 本地文件 远程主机IP:文件路径格式来将本地文件复制到远端。
输入命令后,要求提供远程主机root账号的密码,正确输入密码后文件传输成功。

[root@master .ssh]# scp /etc/hosts 10.0.0.11:/tmp
The authenticity of host '10.0.0.11 (10.0.0.11)' can't be established.
ECDSA key fingerprint is SHA256:XcbgLkoJin+3R2uL/9R8sxuELxjYJOQOABBFodvwug0.
ECDSA key fingerprint is MD5:ee:69:ca:49:b0:6a:78:68:ea:15:3a:7d:d9:a3:a1:1f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.11' (ECDSA) to the list of known hosts.
[email protected]'s password: 
hosts   

2.3 检查文件

此时我们检查10.0.0.11的主机,可以发现 /tmp 目录下的 /etc/hosts 文件。

[root@node1 ~]# ll /tmp/hosts 
-rw-r--r-- 1 root root 214 Dec 13 09:45 /tmp/hosts

2.4 参数说明

除了可以将本地文件复制到远端,也可以将远端的目录下面的文件拉取到本地。
这里涉及了两个常用的参数。

-r 递归的形式复制目录下的文件
-p 复制远程系统的文件时,不改变其文件属性

将远端的/server/scripts下的脚本拉取复制到本地/tmp目录下
首先清理不需要的文件。

[root@master ~]# cd /tmp/
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

其次,复制远端的脚本。

[root@master tmp]# scp -rp 10.0.0.11:/server/scripts/ /tmp/
[email protected]'s password: 
ping.sh                                                                                       100%    1     0.5KB/s   00:00    
vim.sh                                                                                        100%  448   146.4KB/s   00:00   

输入密码后,会显示复制过来的文件。
然后进行检查确认。

[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# tree
.
└── scripts
    ├── ping.sh
    └── vim.sh

1 directory, 2 files

由此可见,将远端的目录与目录下的文件一起复制了。

三 sftp使用

使用该命令,我们可以将远端文件下载到本地,也可以将本地文件上传到远端。

3.1 将文件上传至远端

命令后跟上远端的IP,就可以进入交互式界面。
进入到远端的tmp目录下,将本地刚刚获取的脚本放到远端的tmp目录下。
使用put,将本地文件复制到远端。

[root@master tmp]# sftp 10.0.0.11
[email protected]'s password: 
Connected to 10.0.0.11.
sftp> cd /tmp/
sftp> put /tmp/scripts/ping.sh 
Uploading /tmp/scripts/ping.sh to /tmp/ping.sh
/tmp/scripts/ping.sh                                                                          100%    1     0.1KB/s   00:00  

3.2 将远端文件下载至本地

首先清理一下我们刚才获得的tmp目录下的脚本。

[root@master ~]# cd /tmp/
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

然后进入交互式界面,进入远端的/server/scripts目录,获取脚本

[root@master tmp]# sftp 10.0.0.11
[email protected]'s password: 
Connected to 10.0.0.11.
sftp> cd /server/scripts/
sftp> get vim.sh
Fetching /server/scripts/vim.sh to vim.sh
/server/scripts/vim.sh                                                                        100%  448   316.0KB/s   00:00    
sftp> ^D
[root@master tmp]# ll
total 4
-rw-r--r-- 1 root root 448 Dec 13 10:20 vim.sh

需要注意的是,上传和下载最后存放文件的位置,默认是我们交互式命令开始前,所在的目录下。因此想要上传文件,需要先进入某目录,然后put该文件;想要下载文件至某目录,必须先进入那个目录,然后开启交互式命令,再在远端get该文件。

四 rsync使用

首先清理之前的环境,确保文件可以完整的传输。

# 10.0.0.10
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

# 10.0.0.11
[root@node1 .ssh]# cd /tmp/
[root@node1 tmp]# ll
total 8
-rw-r--r-- 1 root root 214 Dec 13 09:45 hosts
-rw-r--r-- 1 root root   1 Dec 13 10:16 ping.sh
drwx------ 3 root root  17 Dec 13  2022 systemd-private-6e8f91e32c7e42eb98a65c2931c4842d-cups.service-eVdmK7
drwx------ 2 root root   6 Dec  9 23:04 vmware-root_6590-692621205
drwx------ 2 root root   6 Dec  9 17:06 vmware-root_6592-961069012
drwx------ 2 root root   6 Dec 13  2022 vmware-root_6631-1991582773
[root@node1 tmp]# rm -rf *
[root@node1 tmp]# ll
total 0

4.1 检查命令

首先检查本地系统是否有该命令的软件包,能否使用命令。

[root@master tmp]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64

# 如果没有rsync命令,则yum安装
[root@master tmp]# yum install -y rsync

4.2 传输文件

命令格式与scp类似,rsync 参数 本地目录或文件 远端IP:绝对路径

[root@master tmp]# rsync -avz /etc/hosts 10.0.0.11:/tmp
[email protected]'s password: 
sending incremental file list
hosts

sent 172 bytes  received 35 bytes  59.14 bytes/sec
total size is 214  speedup is 1.03

4.3 检查结果

文件准确传输。

[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
[root@node1 tmp]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.10   master
10.0.0.11   node1
10.0.0.12   node2

4.4 传输目录

首先准备环境。
/tmp目录下创建两个文件。

[root@master tmp]# touch master1.sh master2.sh
[root@master tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh

然后先传输文件。

[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password: 
sending incremental file list
./
master1.sh
master2.sh

sent 305 bytes  received 62 bytes  104.86 bytes/sec
total size is 0  speedup is 0.00

检查发现,远端收到了两个普通文件。

[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password: 
sending incremental file list
./
master1.sh
master2.sh

sent 305 bytes  received 62 bytes  104.86 bytes/sec
total size is 0  speedup is 0.00

然后再传输目录。

[root@master tmp]# rsync -avz /tmp 10.0.0.11:/tmp
[email protected]'s password: 
sending incremental file list
tmp/
tmp/master1.sh
tmp/master2.sh
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/

sent 329 bytes  received 78 bytes  116.29 bytes/sec
total size is 0  speedup is 0.00

这次输出的信息好像有点多,然后检查一下远端10.0.0.11的结果。

[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
-rw-r--r-- 1 root root   0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root   0 Dec 13 10:33 master2.sh
drwxrwxrwt 7 root root 129 Dec 13 10:33 tmp

不难发现,这次准确的将目录以及下面的文件都同步了过来。

所以,需要注意的是,如果源目录(被传输的目录)后面有 / ,例如/tmp/,那么将只传输目录/tmp下面的文件;如果源目录(被传输的目录)后面没有 / ,例如/tmp,那么将传输整个目录/tmp及下面的文件。

4.5 常用参数说明

参数-a是一个存档参数,包括下面参数的功能之和。

参数 作用
-r 以递归方式同步整个目录树
-l 同步软连接
-p 保留权限
-t 保留时间戳
-g 保留属组权限
-o 保留文件所有者
-D 同步设备文件

参数-v ,在文件同步时会输出详细的添加信息。
参数-z,在文件传输时进行压缩提高效率。

此处需要注意的是,参数-a不会同步高级文件的权限。
要开启ACL同步,需要再添加-A参数;
要将源文件的SELINUX同步到目标文件,需要添加-X参数。

此外,上文的举例说明是将本地文件同步到远端,也可以将远端文件同步到本地,只需要参数位置换即可。

五 http 常见状态码

一 状态码

状态码是客户端向服务器发送请求的时候,描述返回的请求结果的参数,借助 Http 状态码,可以让用户知道这次请求是正常处理,还是出现了错误。

二 原因划分

不同状态码一般出错的原因可以由以下方式进行划分。

1xx  接收的请求正在处理
2xx  请求正常,处理完毕
3xx  重定向,要附加操作
4xx  客户端出错
5xx  服务端出错

三 具体含义

状态码 作用
200 成功返回网页
301 永久重定向,请求的网页永久跳转到新的位置
302 临时重定向,旧资源仍然可以访问
403 服务端理解客户端的请求,但拒绝其访问,一般是权限不足
404 服务端在指定位置找不到客户端请求的资源
500 内部服务器错误,服务器设置或内部程序问题
501 服务器不具备完成请求的功能
502 坏的网关,代理向后端请求,后端不可用或没有完成请求,一般是代理的节点出现问题
503 服务当前不可用,服务器超载或停机维护
504 网关超时,代理请求后端,后端没有按时处理完请求,一般是服务器过载
505 服务器不支持请求中所用的HTTP协议版本

六 sed命令常用方法

一 常用参数

参数 作用
-r 识别扩展正则符号
-n 取消默认输出,只将进行操作修改的行的内容输出到屏幕
-i 对文件内容进行真正的修改、删除等操作
-e 根据命令的顺序多重编辑

二 搭建测试环境

[root@db01 scripts]# cat id.txt 
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE

三 用法说明

3.1 显示输出信息

根据行号,显示某(几)行信息

##某单行信息
[root@db01 scripts]# sed -n '3p' id.txt 
203,Cindy,ACCA

##连续多行信息
[root@db01 scripts]# sed -n '3,5p' id.txt 
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE

##不连续的多行信息
[root@db01 scripts]# sed -n '3p;5p' id.txt 
203,Cindy,ACCA
205,Eric,HCIE

根据内容,显示某(几)行信息

[root@db01 scripts]# sed -n '/Ci/p' id.txt 
203,Cindy,ACCA
[root@db01 scripts]# sed -n '/Ci/,/ri/p' id.txt 
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
[root@db01 scripts]# sed -n '/Ci/p;/ri/p' id.txt 
203,Cindy,ACCA
205,Eric,HCIE

3.2 添加信息

不修改文件,只在屏幕输出结果。

## 在第1行的上一行插入新数据
[root@db01 scripts]# sed '1i200,Kate,OFI' id.txt 
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE

##在最后一行的下一行添加新数据
[root@db01 scripts]# sed '$a206,Frank,CEO' id.txt 
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO

##也可以把上述2条命令合二为一,按照前后顺序,同时执行
[root@db01 scripts]# sed -e '1i200,Kate,OFI' -e '$a206,Frank,CEO' id.txt 
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO

所以得出规律:
在第x行前面插入(insert),即为 xi
在第y行后面加入(add),即为 ya
1可以表示为第一行
$可以表示为最后一行
连续进行一次性多个操作用-e参数

3.3 删除信息

3.1中的所有p换成d,即可做到相同的(输出)删除操作
p-----print 打印,输出
d-----delete 删除

取消空行的显示(排除空行)
命令一:sed -n '/./p' id.txt
命令二:sed -n '/^$/d' id.txt
命令三:sed -n '/^$/!p' id.txt

3.4 修改信息

不修改文件,只在屏幕输出结果。
格式:sed 's#原有内容#修改后内容#g' 文件名,此处的#可以替换成/等特殊字符

后项引用前项格式:sed 's#(.*)#\1#g' 文件名。在这里,(.*)所匹配的就是\1的内容。

3.5 真正在文件中修改内容

3.23.33.4中所有的写入操作中加上-i参数,如下图所示。

sed -i 's#old#new#g' /tmp/test.txt

此时的添加内容、删除内容、修改内容就会在文件中真实执行,并且在屏幕将结果输出显示。

一般而言,对于重要文件的修改都会进行提前备份,在-i参数后面加上.bak即可同时将源文件进行先备份一份test.txt.bak,再对test.txt进行修改。

sed -i.bak 's#old#new#g' /tmp/test.txt

此外,一般在shell脚本中使用sed批量修改配置文件中,我们可能需要进行整行内容替换。
例如,某一行内容是这样的:

cat /etc/login.defs
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   30
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

此处需要将PASS_MAX_DAYS后面的数字换成50。
在替换过程中需要注意的是,PASS_MAX_DAYS在全文出现了两次,第一次出现在注释中,我们不能去改动,需要改的是第二个参数以及后面的内容。

经过观察可以发现,第二个参数是顶头出现的,我们要替换参数以及后面的东西,于是PASS_MAX_DAYS.*$就是s###g格式的第一个位置的内容,表示要替换参数以及后面的所有内容。
完整修改:sed -i.bak s#PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs

但如果是这样的:

auth  PASS_MAX_DAYS   30   password

此处的参数前后都有内容,被夹在中间,则可以这么匹配。^.*PASS_MAX_DAYS.*$
完整修改:sed -i.bak s#^.*PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs

四 补充说明

-n参数是在查看文件内容时使用,-i参数在真正修改文件时使用。
一般情况下,两个参数不会同时使用,也不能同时使用。
如果同时使用这两个参数,可能会使文件内容清空,是一个危险操作,请勿用错。

七 Linux进程优先级

一 定义描述

大部分情况下,计算机需要运行的进程数超过了计算机拥有CPU的核心数。
通过执行Linux内核的进程调度程序,使用时间片技术,操作系统在单个核心的不同进程之间快速切换,从而给用户一种多个进程并发处理的感受。

采用SCHED_NORMAL策略指定相对优先级,这个优先级称为进程的nice值。
这些nice值的区间范围是[-20,19],数值越小,优先级别越高。

项目 描述
高nice级别 容易将CPU资源让给其他进程
低nice级别 尝试不让出所使用的CPU资源
root用户 可重新调整其他用户进程的nice值
普通用户 只能分配非负的nice值,且只能往大调

二 查看nice值

2.1 使用top命令交互式查看nice值

学习周报-20221216_第1张图片
其中NI表示实际的nice值,区间范围:[-20,19]
PR 将nice值映射到更大的优先级队列,区间范围:[0.39]
映射关系是:NI + 20 = PR

2.2 使用ps命令查看nice值

在使用该命令时,我们会添加axo参数,指定pid、名称、nice值,并降序排列。

ps axo pid,comm,nice --sort=-nice

命令效果如下图:

学习周报-20221216_第2张图片

2.3 查看程序调度策略

某些进程的nice值可能为 -,可能是不同的调度策略所致。
通过ps命令请求cls字段,可以显示不同的程序调动策略。

ps axo cls

如下图所示:

学习周报-20221216_第3张图片
字段TS表示采用SCHED_NORMAL策略,其他内容则是用了不同的程序调动策略。

三 修改nice值

3.1 启动特定nice值的进程

启动进程时,它一般继承父进程的nice值。
所以从命令行启动进程时,它将和启动的shell进程具有相同的nice值。
大多数情况下,新进程启动时的nice值为0。

使用nice命令启动进程,不加其他选项,默认nice级别为10.

nice <命令>

如果想选择nice级别,可以加上-n参数。

要启动nice级别为13的查看文件命令进程。

nice -n 13 cat /etc/hosts

在这里需要注意的是,非特权用户只能把nice值设置为非负的,即[0,19]
只有root用户可以把nice值设置为[-20,-1]

3.2 更改现有进程的nice级别

更改现有进程的nice值,使用renice命令。

例如,监听服务sshd的端口,将这个命令的nice级别更改为15.

renice -n 15 $(netstat -lntup|grep sshd)

你可能感兴趣的:(学习周报,学习,linux)