Skip to content

2、系统管理

进程类

image-20240302100454228

目录

[toc]

export命令

在 Linux 中,export 命令用于设置或显示环境变量。环境变量是在操作系统中用来定义操作系统行为的动态值,它们可以影响运行在该环境中的程序和进程的行为和属性。

当使用 export 命令为一个变量赋值时,该变量不仅在当前会话中可用,也会被传递到由当前会话启动的任何子会话或子进程中。如果没有使用 export,则变量将仅在当前会话中可用,并称为 shell 变量

例如,如果你在命令行中输入:

shell
export PATH=$PATH:/home/user/my_program

这将把 /home/user/my_program 目录添加到 PATH 环境变量中。PATH 环境变量决定了 shell 查找可执行文件的目录。通过修改 PATH,你可以允许系统在不需要指定完整路径的情况下运行你的程序。

使用 export 无参数调用会显示当前环境中设置的所有环境变量列表。

总结一下,export 用于:

  • 将 shell 变量提升为环境变量
  • 确保环境变量会传递给其他进程。
  • 显示当前设置的所有环境变量(如果不带变量名)。

介绍

在Linux操作系统中,export命令是一个非常常用的命令,用于设置Shell环境变量。Shell环境变量是一种特殊的变量,它们被用于存储在Shell中使用的常量和信息。使用export命令,可以将变量从Shell本地传递给任何在Shell新建的进程,包括新的Shell子进程。

export命令通常可以用来设置系统中经常使用的环境变量,以便在所有的Shell进程中都能够访问这些变量。这样,如果想要修改环境变量,只需要修改一份即可,而不需要分别修改每个Shell的配置文件。

案例:设置环境变量

bash
[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# echo $MYVAR
Hello World

上面的代码首先设置了一个环境变量MYVAR,然后再将其输出到终端。输出结果应该是"Hello World"。

案例:将环境变量传递给子进程

bash
[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# bash
[root@linux ~]# echo $MYVAR
Hello World
[root@linux ~]#

上面的代码首先设置了一个环境变量MYVAR,然后在新的Shell子进程中执行了bash命令。子进程可以直接访问MYVAR变量,而不需要重新设置。

案例:列出当前Shell中所有导出的环境变量

使用export -p查看环境变量

bash
export -p
或者
export

上面的代码会列出当前Shell中所有导出的环境变量。

image-20240324144550123

案例:取消环境变量的导出

bash
[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# export -n MYVAR 
[root@linux ~]# echo $MYVAR
Hello World
[root@linux ~]# bash
[root@linux ~]# echo $MYVAR

[root@linux ~]#

上面的代码首先设置了一个环境变量MYVAR,然后使用export -n取消了其导出。这时,MYVAR变量只存在于当前Shell进程中,子进程无法访问。

案例:导出函数

bash
export -f my_function

上面的代码导出了一个名为my_function的函数,以便让其他进程调用该函数。

案例:批量导出环境变量

bash
export $(cat .env | xargs)

上面的代码通过读取.env文件中的所有行,并将其转换成一组export命令,然后批量导出这些环境变量。

注意事项

  • 注意环境变量名的大小写

Linux操作系统对待大小写很敏感,所以在设置环境变量名时,需要注意大小写。

  • 注意环境变量值的用法

环境变量的值可以是任何字符串,但是需要注意该字符串的用法。如果要将命令执行结果作为环境变量值,应该使用反引号或$()

  • 避免环境变量的冲突

如果在Shell中导出了多个同名的环境变量,后导出的变量会覆盖先导出的变量。为了避免这种情况,可以使用唯一的环境变量名。

  • 使用export -p查看环境变量
bash
export -p

上面的代码会列出当前Shell中所有导出的环境变量。

  • 修改环境变量要谨慎

修改环境变量时,一定要谨慎。有些环境变量是系统关键性的,修改可能会影响系统的运行,甚至导致系统崩溃。

kill命令

在类 Unix 操作系统中,kill 命令用来发送信号给进程。以下是一些常见的信号列表,可以通过 kill 命令发送这些信号:

NumberNameDescription
1SIGHUP挂起,通常用于告知进程重新读取配置文件
2SIGINT中断,通常由 Ctrl+C 发出
3SIGQUIT退出,通常由 Ctrl+\ 发出并产生核心转储(core dump)
4SIGILL非法指令,当进程尝试执行损坏的或不存在的代码时发出
5SIGTRAP跟踪/断点捕捉
6SIGABRT/SIGIOT中止,通常由 abort(3) 系统调用产生
7SIGBUS总线错误,非法地址访问
8SIGFPE浮点异常,如除以零或溢出
9SIGKILL杀死信号,用于立即终止进程,不能被捕获或忽略
10SIGUSR1用户自定义信号1
11SIGSEGV段错误,当进程访问其内存段之外的地址时发出
12SIGUSR2用户自定义信号2
13SIGPIPE管道破裂,当进程写入无读端的管道时产生
14SIGALRM时钟定时信号,由 alarm(2) 系统调用产生
15SIGTERM终止信号,用于请求结束进程,可以被捕获或忽略
16SIGSTKFLT堆栈故障(不常见)
17SIGCHLD子进程状态改变,由子进程结束或停止时产生
18SIGCONT继续执行,用于恢复由 SIGSTOP 停止的进程
19SIGSTOP停止执行,用于暂停进程的执行,不能被捕获或忽略
20SIGTSTP终端停止信号,通常由 Ctrl+Z 发出
21SIGTTIN终端输入信号,后台进程请求输入时发出
22SIGTTOU终端输出信号,后台进程请求输出时发出
23SIGURG紧急条件信号,当有紧急条件的套接字出现时发出
24SIGXCPU超出 CPU 时间限制,当进程超过 CPU 资源限制时发出
25SIGXFSZ超出文件大小限制,当进程超过文件大小限制时发出
26SIGVTALRM虚拟时钟定时信号
27SIGPROF性能时钟定时信号
28SIGWINCH窗口大小改变,当终端或窗口大小发生变化时发出
29SIGIOI/O 现在可能进行信号
30SIGPWR电源故障
31SIGSYS/SIGUNUSED非法系统调用(不再使用,与 SIGSYS 合并)

这个列表并不是完整的,不同的系统可能有略微不同的信号列表,例如某些系统可能有 SIGEMT 或其他信号。可以通过 kill -l 命令在特定的系统上查看所有可用的信号。

lsof命令

显示Linux系统当前已打开的所有文件列表 lsof -p pid

lsof命令 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

语法

bash
lsof(选项)

选项

bash
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;

-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;

-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip

-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

安装

最小化默认没安装lsof,需要先安装下:

bash
[root@localhost nginx]# yum install -y lsof

案例:参数说明

image-20250106070146789

lsof输出各列信息的意义如下:

COMMAND:进程的名称

PID:进程标识符

PPID:父进程标识符(需要指定-R参数)

lsof - 显示Linux系统当前已打开的所有文件列表 lsof -p pid

PGID:进程所属组

FD:文件描述符,应用程序通过文件描述符识别该文件。

文件描述符列表:

  1. cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

  2. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init 程序

  3. lnn:library references (AIX);

  4. er:FD information error (see NAME column);

  5. jld:jail directory (FreeBSD);

  6. ltx:shared library text (code and data);

  7. mxx :hex memory-mapped type number xx.

  8. m86:DOS Merge mapped file;

  9. mem:memory-mapped file;

  10. mmap:memory-mapped device;

  11. pd:parent directory;

  12. rtd:root directory;

  13. tr:kernel trace file (OpenBSD);

  14. v86 VP/ix mapped file;

  15. 0:表示标准输出

  16. 1:表示标准输入

  17. 2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

  1. u:表示该文件被打开并处于读取/写入模式。
  2. r:表示该文件被打开并处于只读模式。
  3. w:表示该文件被打开并处于。
  4. 空格:表示该文件的状态模式为unknow,且没有锁定。
  5. -:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:

  1. N:for a Solaris NFS lock of unknown type;

  2. r:for read lock on part of the file;

  3. R:for a read lock on the entire file;

  4. w:for a write lock on part of the file;(文件的部分写锁)

  5. W:for a write lock on the entire file;(整个文件的写锁)

  6. u:for a read and write lock of any length;

  7. U:for a lock of unknown type;

  8. x:for an SCO OpenServer Xenix lock on part of the file;

  9. X:for an SCO OpenServer Xenix lock on the entire file;

  10. space:if there is no lock.

文件类型:

  1. DIR:表示目录。
  2. CHR:表示字符类型。
  3. BLK:块设备类型。
  4. UNIX: UNIX 域套接字。
  5. FIFO:先进先出 (FIFO) 队列。
  6. IPv4:网际协议 (IP) 套接字。
  7. DEVICE:指定磁盘的名称
  8. SIZE:文件的大小
  9. NODE:索引节点(文件在磁盘上的标识)
  10. NAME:打开文件的确切名称

案例:列出指定进程号所打开的文件

bash
lsof -p $pid

案例:获取端口对应的进程ID=>pid

bash
lsof -i:9981 -P -t -sTCP:LISTEN

案例:列出打开文件的进程

bash
lsof $filename

案例:工作常用

bash
[root@VM_0_5_centos sbin]# lsof -i:8000 -NP
COMMAND   PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   11848   root    6u  IPv4 58659472      0t0  TCP *:8000 (LISTEN)
nginx   11849 nobody    6u  IPv4 58659472      0t0  TCP *:8000 (LISTEN)
nginx   18313   root    6u  IPv4 58659472      0t0  TCP *:8000 (LISTEN)
nginx   18314 nobody    6u  IPv4 58659472      0t0  TCP *:8000 (LISTEN)

因此,lsof -i:8000 -NP 的作用是列出所有在本地端口 8000 上活动的网络连接,显示相关的进程信息,并且在输出中不解析主机名和端口号。

说明:

lsof -i:8000 -NP 是一个用于在 Unix-like 操作系统(如 Linux 和 macOS)中查看网络连接和打开文件的命令。下面是对这个命令各个部分的解释:

  1. lsof

lsof 是 "list open files" 的缩写,它是一个用于列出当前系统中所有打开文件的工具。在 Unix/Linux 系统中,几乎所有东西都被视为文件,包括网络连接、设备和常规文件。

  1. -i:8000

这个选项用于指定要查看的网络连接。-i 表示网络相关的文件(如套接字),而 :8000 则指定端口号。在这里,命令会列出所有在端口 8000 上的网络活动,包括监听该端口的进程。

  1. -N

这个选项用于在输出中避免解析主机名,即显示 IP 地址而不是主机名。这可以加快输出速度,并在某些情况下提供更清晰的信息。

  1. -P

这个选项表示在输出中不解析端口号。它将显示端口号而不是服务名称,这对于调试或确认特定服务运行在何端口时非常有用。

总结

因此,lsof -i:8000 -NP 的作用是列出所有在本地端口 8000 上活动的网络连接,显示相关的进程信息,并且在输出中不解析主机名和端口号。

示例输出

运行此命令后,您可能会看到类似以下的输出:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3  1234 user   3u  IPv4 1234567      0t0  TCP *:8000 (LISTEN)

其中包含的信息包括:

  • COMMAND: 运行该进程的命令。
  • PID: 进程 ID。
  • USER: 运行该进程的用户。
  • FD: 文件描述符。
  • TYPE: 文件类型(如 IPv4 或 IPv6)。
  • NAME: 网络地址和端口信息。

希望以上信息能帮助您理解这个命令!如果您还有其他问题,请随时询问。

nohup命令 将程序以忽略挂起信号的方式运行起来

nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。

如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

语法

bash
nohup(选项)(参数)

选项

bash
1. --help:在线帮助;
2. --version:显示版本信息。

参数

bash
程序及选项:要运行的程序及选项。

案例

使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。

bash
nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

案例:该指令表示不做挂断操作,后台下载

bash
nohup wget site.com/file.zip

案例:下面命令,会在同一个目录下生成一个名称为 nohup.out 的文件,其中包含了正在运行的程序的输出内容

bash
nohup ping -c 10 baidu.com

iostat命令

iostat 是一个强大的命令行工具,它可以用来监视磁盘I/O和CPU使用情况。

安装 iostat

大多数 Linux 发行版都预装了 iostat 工具,但如果系统没有安装,可以使用以下命令进行安装:

bash
# 对于基于 Debian 的系统(如 Ubuntu)
sudo apt-get install sysstat

# 对于基于 Red Hat 的系统(如 CentOS)
sudo yum install sysstat

基本用法

1 查看总体磁盘和CPU统计信息

要查看系统的总体磁盘和CPU统计信息,只需在终端中运行 iostat 命令,如下所示:

iostat

这将显示系统的平均CPU利用率和每个磁盘的I/O活动。

image-20241130092341101

2 指定时间间隔和重复次数

可以使用 -t 选项来指定 iostat 输出的时间间隔(以秒为单位),以及 -c 选项来指定输出的次数。

例如,以下命令将每隔2秒显示一次I/O统计信息,并重复5次:

iostat -t 2 5

解析 iostat 输出

iostat 的输出包括许多列,以下是一些常见的列以及它们的含义:

  • avg-cpu:显示平均CPU利用率的统计信息,包括用户、系统和空闲时间。
  • Device:磁盘设备的名称。
  • tps:每秒钟的传输量,表示每秒的I/O操作数。
  • kB_read/s:每秒钟从设备读取的数据量(以KB为单位)。
  • kB_wrtn/s:每秒钟写入设备的数据量(以KB为单位)。
  • %util:设备的利用率,表示设备在给定时间内处于忙碌状态的百分比。

示例代码

1 监视磁盘I/O

以下是一个示例,演示如何使用 iostat 监视磁盘I/O活动:

iostat -d -t 2 10

此命令将每2秒显示一次磁盘I/O统计信息,共显示10次。

2 监视CPU利用率

还可以使用 iostat 监视CPU利用率,如下所示:

iostat -c -t 2 10

这将每2秒显示一次CPU利用率统计信息,共显示10次。

image-20241130092709246

高级用法

当涉及到高级用法时,iostat 提供了一些强大的选项和功能,可以更详细地监视磁盘I/O和CPU性能。以下是一些高级用法,包括示例代码:

1. 监视特定磁盘分区

有时,可能只关心特定磁盘分区的性能。可以使用 -p 选项来指定要监视的分区。例如,以下命令将监视 /dev/sda1 分区的性能:

iostat -p /dev/sda1 -t 2 10

这将每2秒显示一次 /dev/sda1 分区的I/O统计信息,共显示10次。

image-20241130092829221

2. 自定义输出格式

如果需要将 iostat 的输出集成到脚本或其他自动化工具中,可以使用 -o 选项来自定义输出格式。以下是一个示例,将 iostat 输出格式化为逗号分隔值(CSV):

iostat -c -o CSV -t 2 10

这将以CSV格式输出CPU利用率统计信息。

我这里报错了:。。。😂

image-20241130092943152

3. 输出到文件

还可以将 iostat 的输出保存到文件中,以便稍后分析。使用 > 运算符将输出重定向到文件,如下所示:

iostat -d -t 2 10 > iostat_output.txt

这将将磁盘I/O统计信息保存到名为 iostat_output.txt 的文件中。

4. 监视网络设备

iostat 还可以用于监视网络设备的性能。使用 -n 选项,可以查看网络接口的统计信息。

例如,以下命令将监视所有网络接口的性能:

iostat -n -t 2 10

这将每2秒显示一次网络接口的统计信息,共显示10次。

报错:。。。😂

image-20241130093249180

5. 远程监视

如果需要远程监视另一台计算机的性能,可以使用 -h 选项指定远程主机的名称或IP地址。

例如:

iostat -d -t -h remote_host

这将连接到 remote_host 并监视其磁盘I/O活动。

6. 指定块设备

可以使用 -k 选项指定块设备而不是磁盘分区,以获得更详细的I/O统计信息。

例如:

iostat -k -t 2 10

这将每2秒显示一次块设备的I/O统计信息,共显示10次。

image-20241130093433007

7. 自定义输出列

使用 -x 选项,可以自定义 iostat 的输出列。

例如,以下命令将仅显示块设备、传输速率和利用率列:

iostat -x -t 2 10

这将每2秒显示一次指定列的I/O统计信息,共显示10次。

image-20241130093528633

总结

iostat 是一个强大的工具,可用于监视和分析系统的磁盘I/O和CPU性能。通过本文提供的示例代码和解释,可以更好地了解如何使用 iostat 命令来监控系统性能。无论是在故障排除、性能调优还是监视系统健康状况时,iostat 都是一个有用的工具。

su命令 用于切换当前用户身份到其他用户身份

su命令 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。

当以某个用户的身份登录后,在不退出系统重新登录的情况下,可否切换成另一个用户呢?答案是可以的,使用su切换命令来实现

一般在生产中,也不推荐使用root直接登录,而使用普通用户登录执行一般的操作命令。**因为root权限很大,很可能误操作,造成不可挽回的事故。**当需要做管理性任务,利用su命令可以切换至root身份即可。

注意:su命令和sudo命令的使用场景。

  1. 利用su切换身份,需要知道要切换目标用户的密码,所以一般只适合运维工程师使用。
  2. 而在工作中,一些普通用户可能需要执行管理性的任务,但权限不足无法执行。可以事先通过sudo进行授权后,就可以执行这些管理性任务了。(这里需要注意的是,sudo被授权的权限可以是某几个命令或者是root用户可以执行的所有命令)

语法

bash
 su(选项)(参数)

选项

bash
1. -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
2. -f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
3.
-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;# -l --login    su -l userName 相当于su - UserName;        -l和-等价,一般使用-选项即可;
-, -l, --login #开启login shell,如果后面没指定用户,默认为root  


4. -m,-p或--preserve-environment:变更身份时,不要变更环境变量;

-g,—-group <group>	指定主要组
-G,—-supp-group <group>	指定附属组


5. -s<shell>或--shell=<shell>:指定要执行的shell;

6. --help:显示帮助;
7. --version;显示版本信息。

参数

用户:指定要切换身份的目标用户。

案例:变更帐号为test并改变工作目录至test的家目录 (常用)

bash
[root@ecs1 ~]# su - test
Last login: Sat Mar  2 14:25:53 CST 2024 on pts/0
[test@ecs1 ~]$

案例:”su oracle” 和”su - oracle”的区别 (不完全切换和完全切换)(常用)

切换用户的方式: (1)su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换 (2)su -UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

注意:两者适用于不同的场景,没有好坏之分

注意: root su至其他用户无须密码;非root用户切换时需要密码;

“-”代表:开启新的 shell 环境,切换到新用户并且读取新用户的环境变量

没有“-” 不开启新的 shell 环境,保持老用户的环境变量,仅仅切换用户

测试过程:

bash
[root@test data]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin #注意,root用户的PATH变量内容
[root@test data]# pwd
/data

[root@test data]# su wang #(1)su UserName:非登录式切换
[wang@test data]$ pwd #不改变当前工作目录
/data
[wang@test data]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 
[wang@test data]$ whoami
wang
[wang@test data]$ id
uid=1002(wang) gid=1003(wang) groups=1003(wang)
[wang@test data]$ exit
exit

[root@test data]# pwd
/data
[root@test data]# su - wang #(2)su -UserName:登录式切换
Last login: Fri Feb 12 21:58:26 CST 2021 on pts/1
[wang@test ~]$ pwd #切换至自已的家目录
/home/wang
[wang@test ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wang/.local/bin:/home/wang/bin #注意,普通用户的PATH变量内容
[wang@test ~]$

通过上面示例,可以发现: (1)只用su wang切换用户时,当前工作目录和环境变量,如: PATH,保持不变。 (2)当使用su - wang切换时,当前工作目录和环境变量,如:PATH,都发生了变化,感觉就像重新登录一样。

案例:变更帐号为root并在执行ls指令后退出变回原使用者

备注:-c选项是指换个身份执行命令并显示在当前shell下,而不用直接先切换到相应账户,再执行命令,最后退出用户这个步骤。(更加方便,一次性到位

格式:

bash
su [-] userName -c 'COMMAND'

测试过程:

bash
[ZXL@test ~]$ tail /etc/shadow #默认普通用户无权限访问/etc/shadow文件
tail: cannot open ‘/etc/shadow’ for reading: Permission denied

[ZXL@test ~]$ su - root -c "tail -n3 /etc/shadow" #-c选项
Password: #这边su到root需要输入root的密码
postfix:!!:18632::::::
ZXL:$6$dYWhyHiv$7qylecKp.7cjZzo1z6qy9ItOxWdsGU3C7q3V.omhvDvFGHgzrQq0LN4ymrYZ4fmqPqLufhsaHSNzt/tmDJCyD0:18647:0:99999:7:::
HG:$6$p3l12jXa$Q200prDqdibs2.XS6EfSbOKWwIqLDr91h5TY4q.f1koPHKfWvjZhXFrji3mrURME3HYkXGvnrdPpN3mBBTZ6i1:18647:0:99999:7:::

[ZXL@test ~]$ su  -c "tail -n3 /etc/shadow" #su后面为空默认代表su到root:su root
Password:  #这边su到root需要输入root的密码
postfix:!!:18632::::::
ZXL:$6$dYWhyHiv$7qylecKp.7cjZzo1z6qy9ItOxWdsGU3C7q3V.omhvDvFGHgzrQq0LN4ymrYZ4fmqPqLufhsaHSNzt/tmDJCyD0:18647:0:99999:7:::
HG:$6$p3l12jXa$Q200prDqdibs2.XS6EfSbOKWwIqLDr91h5TY4q.f1koPHKfWvjZhXFrji3mrURME3HYkXGvnrdPpN3mBBTZ6i1:18647:0:99999:7:::
[ZXL@test ~]$ exit
logout

范例:su -s /bin/bash - ZXL        #临时指定用户shell类型

bash
-s选项:临时指定用户shell类型

测试过程: 这种情况一般是因为家目录下没有默认的初始文件而导致的:

bash
[root@test ~]# getent passwd bin
bin:x:1:1:bin:/bin:/sbin/nologin
[root@test ~]# su -s /bin/bash bin
bash-4.2$ pwd
/root
bash-4.2$ ls /bin/.bash^C
bash-4.2$ exit
exit

[root@test ~]# ll -a /etc/skel/ #每个创建用户家目录下的初始化文件
total 24
drwxr-xr-x.  2 root root   62 Jan  5 22:43 .
drwxr-xr-x. 78 root root 8192 Feb  8 21:51 ..
-rw-r--r--.  1 root root   18 Aug  8  2019 .bash_logout
-rw-r--r--.  1 root root  193 Aug  8  2019 .bash_profile
-rw-r--r--.  1 root root  231 Aug  8  2019 .bashrc
[root@test ~]# 

[root@test ~]# ll -a /home/ZXL/
total 16
drwx------. 2 ZXL  ZXL   98 Feb  8 21:33 .
drwxr-xr-x. 4 root root  27 Jan 20 20:20 ..
-rw-r--r--. 1 ZXL  ZXL   18 Aug  8  2019 .bash_logout
-rw-r--r--. 1 ZXL  ZXL  193 Aug  8  2019 .bash_profile
-rw-r--r--. 1 ZXL  ZXL  231 Aug  8  2019 .bashrc
[root@test ~]#

范例:所谓的用户身份切换只不过是在原来的shell中又通过Su命令新开了一个shell而已。

我们在一台主机上使用wang用户登录,查看一下当前的shell进程,然后切换到root用户身份,再次查看一下shell进程:

注意,自己对pstree命令关于shell进程这里理解的不到位。。。。。

老师课件内容如下:

实际测试输出如下:

bash
[wang@test ~]$ pstree|grep bash
        |-sshd-+-sshd---bash---su---bash
        |      `-sshd---sshd---bash-+-grep
[wang@test ~]$ su root
Password: 
[root@test wang]# pstree |grep bash
        |-sshd-+-sshd---bash---su---bash
        |      `-sshd---sshd---bash---su---bash-+-grep
[root@test wang]# exit
exit
[wang@test ~]$ exit

注意:

所谓的用户身份切换只不过是在原来的shel中又通过_Su命令新开了一个shell而已。因此,su切换新用户后,记得使用exit退回至旧的用户,而不要再用su切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱

案例:变更帐号为root并传入 -f 选项给新执行的shell

bash
su root -f

useradd命令 (创建新的用户或更改用户的信息)

useradd命令用来创建新的用户或更改用户的信息

useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

语法

格式: useradd [参数] [用户名]   #已创建的用户通常会有一个与用户名相同的组名。

选项

常见选项:

-u UID -o配合-u选项,不检查UID的唯一性

-g GID指明用户所属基本组,可为组名,也可以GID; -GGROUP1[ ,GROUP2,...]为用户指明附加组,组须事先存在

-c "COMMENT"用户的注释信息

-d HOME_DIR以指定的路径(不存在)为家目录

-D, --defaults                print or change default useradd configuration #打印或改变用户的默认useradd

-s SHELL指明用户的默认shell程序,可用列表在/etc/shells文件中

-N不创建私用组做主组,使用users组做主组

-r创建系统用户 centos 6之前:ID<500,centos 7以后:ID<1000

-k 必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录;

-m 创建用户的HOME目录; (useradd命令有个参数可以强制生成家目录:) -M 不建立用户家目录,优先于/etc/login.defs文件设定;

-e expire_date 用YYYY-MM-DD格式指定一个账户过期的日期; -f 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1;

-n 创建一个与用户登录名同名的新组; -p passwd 为用户账户指定默认密码;

范例:新建用户

bash
useradd 用户

范例:创建系统用户 😊

注意:useradd命令加-r选项后,默认就不会生成/home/下的家目录了;也不会创建对应的邮箱文件

bash
[root@test ~]# useradd -r test1 # centos 6之前:ID<500,centos 7以后:ID<1000

[root@test ~]# getent passwd test1
test1:x:998:996::/home/test1:/bin/bash
[root@test ~]# ls /home/
HG  wang  ZXL
[root@test ~]#

注意:/usr/sbin/adduser是/usr/sbin/useradd的软链接文件。

bash
[root@test ~]# which useradd
/usr/sbin/useradd
[root@test ~]# which adduser
/usr/sbin/adduser

[root@test ~]# ll /usr/sbin/adduser 
lrwxrwxrwx. 1 root root 7 Jan  5 22:44 /usr/sbin/adduser -> useradd
[root@test ~]#

范例:工作中常用到的创建用户命令

bash
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache

或者:

bash
[root@linux-test ~]#groupadd -r -g 306 mysql
[root@linux-test ~]#useradd -r -g 306 -u 306 -d /data/mysql mysql

groupadd命令选项:

bash
-r, --system                  create a system account
-g, --gid GID                 use GID for the new group

useradd命令选项:

bash
  -g, --gid GROUP               name or ID of the primary group of the new
                                account                             
   -r, --system                  create a system account  
   
   -m, --create-home             create the user's home directory 很少用到

范例:useradd -d 指定家目录 用户名

注意细节:

  1. 当创建用户成功后,会自动的创建和用户同名的家目录
  2. 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录 #注意,使用这个-d参数时,家目录必须要原来不存在才行

这里需要注意的是: 如果用指定家目录时,该目录原来已经存在时,必须使用cp -a /etc/skel. /新指定的家目录,因此建议直接创建家目录即可:

bash
#如下实验测试用-d选项指定家目录时,原来目录存在的情况。[root@test ~]# mkdir /tmp/dog
[root@test ~]# useradd -d /tmp/dog dog #-d选项useradd: 
warning: the home directory already exists.Not copying any file from skel directory into it.
[root@test ~]# passwd dog
Changing password for user dog.New password: BAD PASSWORD: The password is shorter than 8 charactersRetype new password: passwd: all authentication tokens updated successfully.
[root@test ~]# su - dog
Password: 
-bash-4.2$ pwd #因该用户家目录缺少相应的文件,因此这里显示异常。
/tmp/dog
-bash-4.2$ ls -a.  ..
-bash-4.2$ exitlogout
[root@test ~]# cp -a /etc/skel/. /tmp/dog/ #复制相应文件到该用户家目录下
[root@test ~]# su - dogLast 
login: Thu Feb 18 11:17:57 CST 2021 on pts/0Last failed login: Thu Feb 18 11:18:19 CST 2021 on pts/0There was 1 failed login attempt since the last successful login.
[dog@test ~]$ ls -a #复制相应文件到该用户家目录下后,显示就正常了。
.  ..  .bash_logout  .bash_profile  .bashrc
[dog@test ~]$ pwd/tmp/dog[dog@test ~]$

groupadd命令 (创建组)

groupadd实现创建组。

语法

groupadd [OPTION]... group_name

选项

-g GID指明GID号; [GID_MIN,GID_MAX]

-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后:ID<1000

范例:创建组

bash
groupadd 组名

范例:创建系统组同时指定gid

bash
groupadd -g 48 -r apache

[root@test ~]# getent group|grep 48
[root@test ~]# groupadd -g 48 -r apache
[root@test ~]# getent group|grep 48
apache:x:48:
[root@test ~]# getent group|grep apache
apache:x:48:
[root@test ~]#


##说明
 -g, --gid GID                 use GID for the new group
-r, --system                  create a system account

usermod命令

案例:修改用户主组

bash
usermod -g adr adr #修改用户主组:usermod -g 主组 用户名

案例:添加用户附加组

bash
usermod -a -G bossnm adr #添加用户附加组:usermod -a -G 附加组 用户名

ps命令 (查看进程)

参数含义

  • a:显示所有用户的进程。
  • u:以用户为中心显示进程信息。
  • x:显示没有控制终端的进程。
  • -e:显示系统中的所有进程,而不仅仅是与当前终端相关的进程。这相当于 --all 选项。
  • -f:以完整格式显示进程信息。这包括用户ID(UID)、进程ID(PID)、父进程ID(PPID)、进程启动时间、运行的命令等。
  • o:自定义输出格式。

案例:ps aux 显示当前系统中所有进程的信息(推荐)

ps aux

  • 显示当前系统中所有进程的信息,包括用户、CPU和内存使用情况、命令等。
  • a:显示所有用户的进程。
  • u:以用户为中心显示进程信息。
  • x:显示没有控制终端的进程。

image-20241128064233084

案例:ps -ef 显示当前系统中所有进程的信息

ps -ef 命令用于在 Unix/Linux 系统中显示所有正在运行的进程及其详细信息。选项的含义如下:

  • -e:显示系统中的所有进程,而不仅仅是与当前终端相关的进程。这相当于 --all 选项。

  • -f:以完整格式显示进程信息。这包括用户ID(UID)、进程ID(PID)、父进程ID(PPID)、进程启动时间、运行的命令等。

使用 ps -ef 可以帮助系统管理员全面了解系统中的进程情况,便于进行进程管理和故障排查。该命令输出的信息通常用于诊断系统性能问题或检查不正常的进程行为。

image-20241128064404260

案例:

pstree命令

在 CentOS 7 中安装 pstree 命令,您需要使用包管理器 yumpstree 通常包含在 psmisc 包中,这是一个包含多个小的实用程序的集合,这些实用程序用于监控进程。

要安装 pstree,您可以按照以下步骤操作:

  1. 打开终端。
  2. 输入以下命令来安装 psmisc 包:
bash
sudo yum install psmisc -y
  1. 系统可能会要求您确认安装。如果是,请输入 y 然后按 Enter 键继续。
  2. 安装完成后,您就可以使用 pstree 命令了。

请注意,需要管理员权限(通过 sudo)来安装软件包。如果您的用户账户没有提供相应权限,您可能需要联系系统管理员来执行这一安装。

passwd命令 (修改用户密码)

案例:查看用户passwd文件内容

bash
[root@linux-test ~]#getent passwd mysql
mysql:x:998:996:MySQL server:/var/lib/mysql:/sbin/nologin

案例:修改用户密码

bash
echo adr:123456 | chpasswd

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

往期推荐

QQ群

《玩转Typora+Docusuaurus+起始页》交流群:(欢迎小伙伴一起探讨有趣的IT技术,来完成一些漂亮的项目)

开源项目:

项目名称我的文档我的demo作者demo
1、玩转Typorahttps://wiki.onedayxyy.cn/docs/typorahttps://wiki.onedayxyy.cn/docs/typorahttps://typoraio.cn/#
2、玩转Docusaurushttps://wiki.onedayxyy.cn/docs/mogai-docusaurushttps://wiki.onedayxyy.cn/https://www.docusaurus.cn/
3、个人主页home3.0https://wiki.onedayxyy.cn/docs/home3.0https://onedayxyy.cn/https://github.com/hsBUPT/hsBUPT.github.io
4、家庭相册filesite-iohttps://wiki.onedayxyy.cn/docs/filesite.io-photot-install-fullhttps://photo.onedayxyy.cn/https://demo.jialuoma.cn/

https://wiki.onedayxyy.cn/docs/OpenSource

image-20241007221810896

  • typora皮肤

https://wiki.onedayxyy.cn/docs/typora

image-20241007221846691

  • 起始页

https://onedayxyy.cn/

image-20240814230557697

  • 知识库/博客

https://wiki.onedayxyy.cn/

  • 个人相册

https://photo.onedayxyy.cn/

image-20241028072523651

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!