【Linux】Linux 常用命令

Linux 和 Unix

https://www.zhihu.com/question/24217234/answer/360949879

Unix于1969年由贝尔实验室开发出来,使用至今已变更了很多个版本。目前主流的Unix系统有三种,分别是AIX、HP-UX、Solaris,这些Unix系统互不兼容。

Linux于1991年由芬兰大学生Linus开发出来,是一个类Unix系统,但是其代码不源自任何Unix版本,完全不是Unix的一个分支,而是一个开源版的模仿。

安装Linux虚拟机教程:https://blog.csdn.net/qq_41571900/article/details/84728480; https://mp.weixin.qq.com/s/onVwwEQ1DAwbvK7qS2YNxg

Linux 开发环境配置文档

Linux 目录结构

linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录**“ / ”**,然后在此目录下再创建其他的目录。在Linux世界里,一切皆文件。

image-20210721140508417

  • /bin (/usr/bin、/usr/local/bin):是Binary的缩写,这个目录存放着最经常使用的命令
  • /sbin (/usr/sbin、/usr/local/sbin):Super User Binary的缩写,这里存放的是系统管理员使用的系统管理程序
  • /home:存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的
  • /root系统管理员目录,也称作超级权限者的用户主目录
  • /lib:系统开机所需要最基本的动态连接共享库 .so,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库
  • /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件
  • /etc:所有的系统管理所需要的配置文件和子目录 my.conf
  • /usr:Unix System Resource的缩写,存放Unix系统的资源。这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录
  • /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件
  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息
  • /srv:service缩写,该目录存放一些服务启动之后需要提取的数据
  • /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统
  • /tmp:这个目录是用来存放一些临时文件的
  • /dev:类似于windows的设备管理器,把所有的硬件用文件的形式存储
  • /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。比如共享文件夹 D:/myshare
  • /opt:这是存放应用程序压缩包的目录。如安装ORACLE数据库的压缩包就可放到该目录下。默认为空。
  • /usr/local:主要存放那些手动安装的软件的目录。一般是通过编译源码或解压压缩包的方式安装的程序。例如安装JDK环境。
  • /var:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的文件和目录放在这个目录下。包括各种日志文件。
  • /selinux [security-enhanced linux]:SELinux是一种安全子系统,它能控制程序只能访问特定文件。

硬链接和软链接

https://www.huaweicloud.com/articles/e2aa9d7612d1446629d95ced9b16a1d5.html

  • 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用
  • 软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件

硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识);而软链接不共享 inode,也可以说是个特殊的 inode,所以和原来的 inode 有区别。若原文件删除了,则该软连接则不可以访问,而硬连接则是可以的。由于符号链接的特性,导致其可以跨越磁盘分区,但硬链接不具备这个特性。

创建硬链接:

1
2
3
[root@localhost root] touch f1  #创建一个测试文件f1

[root@localhost root] ln f1 f2 #创建f1的一个硬链接文件f2

创建软链接

1
[root@localhost root] ln -s f1 f3  #创建f1的一个符号连接文件f3

用户管理

增加用户

1
[root@localhost root] useradd -g 用户组名 用户名

查看用户信息

1
[root@localhost root] id 用户名

增加组

1
[root@localhost root] groupadd 用户组名

修改用户密码

1
[root@localhost root] passwd 用户名

/etc/passwd:用户(user)的配置文件,记录用户的各种信息。每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

image-20210722210112194

/etc/group:组(group)的配置文件,记录Linux包含的组的信息。每行含义:组名:口令:组标识号:组内用户列表

image-20210722210316408

/etc/shadow:口令的配置文件。每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

image-20210722210303001

组管理

在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。

修改文件所有者(chown:change owner)

1
[root@localhost root] chown [-R] 用户名 文件名/文件目录名

修改文件所在组(chgrp:change group)

1
[root@localhost root] chgrp [-R] 组名 文件名/文件目录名

改变用户所在组(usermod:user modify)

1
2
3
[root@localhost root] usermod –g 组名 用户名

[root@localhost root] usermod –d 目录名 用户名 改变该用户登陆的初始目录。

参数选项

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

权限

https://www.runoob.com/linux/linux-file-attr-permission.html

image-20210724193608190

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:

1
2
3
4
5
[root@localhost root] ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
……

实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file);
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

每个文件的属性由左边第一部分的 10 个字符来确定(如下图):

image-20210724193922713

从左至右用 0-9 这些数字来表示。

第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

其中,第 1、4、7位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;第2、5、8位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第3、6、9位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。

rwx作用到文件

  • [ r ] 代表可读(read): 可以读取,查看
  • [ w ] 代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
  • [ x ] 代表可执行(execute):可以被执行

rwx作用到目录

  • [ r ] 代表可读(read): 可以读取,ls查看目录内容
  • [ w ] 代表可写(write): 可以修改,目录内创建+删除+重命名目录
  • [ x ] 代表可执行(execute):可以进入该目录

rwx作用到文件和目录上的区别:

  • 对[ r ]来说,二者都是读取内容;
  • 对[ w ]来说,若文件没有该权限,则无法修改和删除该文件;若目录没有该权限,则无法在该目录内创建和删除文件,也无法重命名;
  • 对[ x ]来说,若文件没有该权限,则无法被执行;若目录没有该权限,则无法进入该目录

权限相关指令

修改权限:

u: 所有者 g: 所有组 o: 其他人 a: 所有人(u、g、o的总和)

1
2
3
4
5
6
7
[root@localhost root] chmod [-R] u=rwx,g=rx,0=x 文件目录名  # 给文件目录

[root@localhost root] chmod o+w 文件目录名 # 给文件目录增加权限

[root@localhost root] chmod u=rwx,g=rx,o=x 文件目录名
# 上述命令等价于:
[root@localhost root] chmod 751 文件目录名

-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改

Linux 系统运行级别

  • 0 :关机
  • 1 :单用户模式,不需要输入密码【可用于找回丢失密码】
  • 2:多用户状态没有网络服务
  • 3:多用户状态有网络服务
  • 4:系统未使用,保留给用户
  • 5:图形界面
  • 6:系统重启

常用运行级别是3和5 ,要修改默认的运行级别可改文件

image-20210722210529000

切换到指定的运行级别命令:

1
[root@localhost root] init [0~6]

使用案例:找回丢失的root密码?

思路:进入到单用户模式,修改root密码。因为进入单用户模式,root不需要密码就可以登录

常用命令

man:获得帮助信息

1
[root@localhost root] man [命令或配置文件]

help:获得帮助信息

1
[root@localhost root] help [命令]

文件目录类

mkdir:创建目录

1
[root@localhost root] mkdir [选项] 要创建的目录

常用选项:-p 创建多级目录

rmdir:删除空目录(只能删除空目录,如果目录下有内容时无法删除)

1
[root@localhost root] rmdir [选项] 要删除的空目录

如果需要删除非空目录,需要使用rm -rf

rm:移除文件或目录

1
[root@localhost root] rm [选项] 要删除的文件或目录

常用选项:

  • -r :递归删除整个文件夹
  • -f:强制删除不提示

mv:移动文件与目录或重命名

1
2
3
[root@localhost root] mv oldNameFile newNameFile (功能描述:重命名)

[root@localhost root] mv /temp/movefile /targetFolder (功能描述:移动文件)

touch:创建空文件

1
[root@localhost root] touch hello.java

cp:拷贝文件到指定目录

1
[root@localhost root] cp [选项] /home/aaa.txt /home/dest/

常用选项:-r 递归复制整个文件夹

文件阅读类

cat:查看文件内容(concatenate)。cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令 | more

1
[root@localhost root] cat [选项] 要查看的文件

常用选项:-n 显示行号

more:是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键

https://zhuanlan.zhihu.com/p/50383258

1
[root@localhost root] more 要查看的文件
操作 功能说明
空白键(space) 代表向下翻一页;
Enter 代表向下翻一行;
/hello 查找文本中hello字段,按N查找下一个
q 代表立刻离开more ,不再显示该文件内容。
Ctrl+F 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号

less:用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率

1
[root@localhost root] less 要查看的文件
操作 功能说明
空白键(space) 向下翻一页;
[pagedown] 向下翻动一页
[pageup] 向上翻动一页;
q 代表立刻离开more ,不再显示该文件内容。
/字串 向下搜寻『字串』的功能;n:向下查找;N:向上查找;下滚动一屏
?字串 向上搜寻『字串』的功能;n:向上查找;N:向下查找;

对比:

  • more – 传统且基础的分页阅读工具,仅支持向下翻页和有限次数的向上翻页。
  • less – 比 more 功能丰富,支持向下翻页和向上翻页,也支持文本搜索。在打开大文件的时候,比 vi 这类文本编辑器启动得更快。
  • most – 在上述两个工具功能的基础上,还加入了同时打开多个文件、同时锁定或滚动多个屏幕、分屏等等大量功能

head:显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容

1
[root@localhost root] head -n 5 文件(功能描述:查看文件头5行内容,5可以是任意行数)

tail:输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容。

1
2
3
4
5
[root@localhost root] tail 文件(功能描述:查看文件后10行内容)

[root@localhost root] tail -n 5 文件(功能描述:查看文件后5行内容,5可以是任意行数)

[root@localhost root] tail -f 文件(功能描述:实时追踪该文档的所有更新)

主要区别:

  • cat命令可以一次显示整个文件,如果文件比较大,使用不是很方便;
  • more命令可以让屏幕在显示满一屏幕时暂停,按空格往前翻页,按b往后翻页。
  • less命令也可以分页显示文件,和more命令的区别就在于:
    • 支持上下键卷动屏幕、查找。
    • 不需要在一开始就读取整个文件,打开大文件时比more、vim更快
  • head命令用于查看文件的前n行。
  • tail命令用于查看文件的后n行。加上-f命令,查看在线日志非常方便,可以打印最新增加的日志。

> 指令和 >> 指令

  • >:输出重定向(覆盖写)
  • >>:追加(不覆盖)
1
2
3
4
5
6
7
[root@localhost root] ls -l > 文件(功能描述:列表的内容写入文件a.txt中(覆盖写))

[root@localhost root] ls -al >> 文件(功能描述:列表的内容追加到文件aa.txt的末尾)

[root@localhost root] cat 文件1 > 文件2(功能描述:将文件1的内容覆盖到文件2)

[root@localhost root] echo "内容" >> 文件

history:查看已经执行过历史命令,也可以执行历史指令

搜索查找类

find

从根目录开始搜索文件/目录

1
[root@localhost root] find / -name file1

搜索用户user1的文件/目录

1
[root@localhost root] find / -user user1

locate

locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻。

1
[root@localhost root] locate <关键词> 

由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库。

grep:Global regular expression print。用于查找文件里符合条件的字符串。

全局正则表达搜索:

1
[root@localhost root] grep xxx hello.txt # 在⽂件hello.txt中查找关键词 xxx

gzip/gunzip

1
2
3
[root@localhost root] gzip 文件       # 压缩文件,只能将文件压缩为*.gz文件

[root@localhost root] gunzip 文件.gz # 解压缩文件命令

zip/unzip

1
2
3
4
5
[root@localhost root] zip xxx.zip file # 压缩⾄zip包

[root@localhost root] zip -r xxx.zip file1 file2 dir1 # 将多个⽂件+⽬录压成zip包

[root@localhost root] unzip XXX.zip # 解压缩文件

tar

tar 指令是打包指令,最后打包后的文件是.tar.gz 的文件。

选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost root] tar -cvf xxx.tar file1 file2 dir1 # 将多个⽂件+⽬录打tar包

[root@localhost root] tar -tf xxx.tar # 查看tar包的内容

[root@localhost root] tar -xvf xxx.tar # 解压tar包

[root@localhost root] tar -xvf xxx.tar -C /dir # 将tar包解压⾄指定⽬录

[root@localhost root] tar -cvfj xxx.tar.bz2 dir # 创建bz2压缩包

[root@localhost root] tar -jxvf xxx.tar.bz2 # 解压bz2压缩包

[root@localhost root] tar -cvfz xxx.tar.gz dir # 创建gzip压缩包

[root@localhost root] tar -zxvf xxx.tar.gz # 解压gzip压缩包

网络通讯类

Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。

telnet

1
[root@localhost root] telnet IP 端口

dhclient:为本机分配一个网络内可用的IP地址

1
[root@localhost root] dhclient

编辑虚拟机系统网卡配置:

1
[root@localhost root] vim /etc/sysconfig/network-scripts/ifcfg-ens33

修改配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
// 修改为静态IP
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=824ec4bd-a9ae-4410-8346-17ce7f3dd111
DEVICE=ens33
// 设置IP地址等信息
ONBOOT=yes
IPADDR=192.168.31.21
NETMASK=255.255.255.0
GATEWAY=192.168.31.1
DNS1=119.29.29.29

编辑完成,重启网络设置即可

1
[root@localhost root] systemctl restart network.service

实用指令

which:在环境变量 $PATH 设置的目录里查找符合条件的文件。

查看 Java 的安装路径

1
[root@localhost root] which java

nohup: no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

语法格式:

1
nohup Command [ Arg … ] [ & ]
  • Command:要执行的命令。
  • Arg:一些参数,可以指定输出文件。
  • &:让命令在后台执行,终端退出后命令仍旧执行。

示例:

1
[root@localhost root] nohup java -jar xxx.java &

& 最经常被用到,其用在一个命令的最后,可以把这个命令放到后台执行,不挂起

jobs:查看有哪些任务正在后台运行

jobs 详解:https://www.cnblogs.com/mfryf/archive/2012/05/09/2491322.html

1
[root@localhost root] jobs -l        # 显示当前系统的任务列表

上面的命令执行后,将显示出当前系统下的任务列表信息,具体如下所示:

1
[1] + 1903 运行中          nohup java -jar xxx.java &

sz:把日志文件下载到本地

rename 命令:

1
2
3
4
5
# Perl语言版本格式
[root@localhost root] rename 's/a/b/' * # 将当前目录下的所有文件名中的 a 替换为 b

# C语言版本格式
[root@localhost root] rename a b *

https://blog.51cto.com/jiemian/1846951

free 命令:查看系统可用内存大小:

1
[root@localhost root] free -m

定时任务调度

https://www.runoob.com/w3cnote/linux-crontab-tasks.html

任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:

  • 系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等
  • 个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。

指令:

1
[root@localhost root] crontab [选项]
参数选项 功能
-e 编辑crontab定时任务
-l 列出当前有哪些crontab任务调度
-r 终止任务调度,删除当前用户所有的crontab任务

使用 crontab -e 进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

crontab 的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

  • ***** 取值范围内的所有数字
  • / 每过多少个数字
  • - 从X到Z
  • **,**散列数字

时间说明:

1
2
3
4
5
6
7
8
# .---------------- 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
# | | | | |
# * * * * * command to be executed
  • minute:代表一小时内的第几分,范围 0-59。
  • hour:代表一天中的第几小时,范围 0-23。
  • mday:代表一个月中的第几天,范围 1-31。
  • month:代表一年中第几个月,范围 1-12。
  • wday:代表星期几,范围 0-7 (0及7都是星期天)。
  • who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
  • command:所要执行的指令

更多使用案例见:https://www.runoob.com/w3cnote/linux-crontab-tasks.html

重启任务调度

1
[root@localhost root] service crond restart

案例

案例一

使用 crontab -e 的方式直接编辑命令:

  • 设置任务调度文件:/etc/crontab
  • 设置个人任务调度。执行 crontab –e 命令。
  • 接着输入任务到调度文件如:*/1 * * * * ls –l /etc/ > /tmp/to.txt,意思说每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令
  • crontab -r 终止任务

案例二

如果指令比较复杂,可以将其先写入到一个 .sh 文件中,然后再在 crontab -e 中执行该脚本文件

  • 编写脚本文件:/home/mytask.sh,在其内写上要执行的命令
  • mytask.sh 赋予可执行的权限
  • 执行 crontab -e 命令
  • 在其中输入 */1 * * * * /home/mytask.sh即可
  • crontab -r 终止任务

分区

补充:Linux兄弟连

Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。

Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。

查看所有设备挂载情况:

1
[root@localhost root] lsblk

挂载:将一个分区与一个目录联系起来(mount 设备名称 挂载目录

1
2
3
[root@localhost root] mount /dev/sdb1 /newdisk

[root@localhost root] umount/dev/sdb1 或者 umount/newdisk

用命令行挂载重启后会失效。永久挂载:通过修改/etc/fstab实现挂载。添加完成后执行mount –a 即刻生效。

查询系统整体磁盘使用情况:

1
[root@localhost root] df -h

查询指定目录的磁盘占用情况,默认为当前目录:

1
[root@localhost root] du -h /目录

参数:

  • -s指定目录占用大小汇总
  • -h 带计量单位
  • -a 含文件
  • –max-depth=1 子目录深度
  • -c 列出明细的同时,增加汇总值

进程

在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。例如www服务器。

每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才结束。

进程历史

补充兄弟连

https://www.cnblogs.com/zwcry/p/9602756.html

历史上,Linux 的启动一直采用init进程。CentOS 6.0中使用下面的命令用来启动服务。

1
2
3
$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

这种方法有两个缺点:

  • 一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 概述

Systemd 就是为了解决这些问题而诞生的。它的设计目标是为系统的启动和管理提供一套完整的解决方案。根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统

使用了 Systemd,就不需要再用init了。Systemd 取代了initd成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程

1
$ systemctl --version

上面的命令查看 Systemd 的版本。

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

systemctl是 Systemd 的主命令,用于管理系统。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

systemctl命令是Linux系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。ctl代表Control

systemctl — Control the systemd system and service manager

查看进程

ps(process status)命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数。

  1. 查看某种服务的进程(例如查看java相关服务的进程):
1
2
3
4
5
[root@localhost root] ps –aux | grep xxx

[root@localhost root] ps –aux | grep java

[root@localhost root] ps –aux | grep sshd

参数说明:

  • -a 显示所有用户的进程(show processes for all users)
  • -u 显示用户(display the process’s user/owner)
  • -x 显示无控制终端的进程(also show processes not attached to a terminal)
  1. 以全格式显示当前所有的进程:
1
[root@localhost root] ps -ef

参数说明:

  • -e 显示所有进程
  • -f 全格式
1
[root@localhost root] ps -ef | grep xxx
  1. 以树状结构展示进程
1
[root@localhost root] pstree
  1. 终止进程(强迫进程立即停止):
1
[root@localhost root] kill -9 进程号

详解:

https://cloud.tencent.com/developer/user/1410546

ps -aux 是以BSD方式显示

a 显示所有用户的进程(show processes for all users) u 显示用户(display the process’s user/owner) x 显示无控制终端的进程(also show processes not attached to a terminal)

ps -ef 是以System V方式显示,该种方式比BSD方式显示的多

e 显示所有用户的进程(all processes)此参数的效果和指定"a"参数相同 f 用ASCII字符显示树状结构,表达程序间的相互关系(ASCII art forest)

下面看两个命令各自显示哪些内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ps -aux 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4828 516 ? Ss 2014 1:28 init [3]
root 2 0.0 0.0 0 0 ? S 2014 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2014 0:43 [migration/0]
root 4 0.0 0.0 0 0 ? S 2014 7:34 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 2014 0:01 [migration/0]
root 6 0.0 0.0 0 0 ? S 2014 0:03 [watchdog/0]
root 7 0.0 0.0 0 0 ? S 2014 3:04 [migration/1]
root 8 0.0 0.0 0 0 ? S 2014 0:01 [migration/1]
root 9 0.0 0.0 0 0 ? S 2014 1:44 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S 2014 0:01 [watchdog/1]
root 11 0.0 0.0 0 0 ? S 2014 2:21 [migration/2]
root 12 0.0 0.0 0 0 ? S 2014 0:01 [migration/2]

其中显示了:

1、USER 哪个用户启动了这个命令 2、PID 进程ID 3、CPU CPU占用率 4、MEM 内存使用量 5、VSZ 如果一个程序完全驻留在内存的话需要占用多少内存空间 6、RSS 当前实际占用了多少内存 7、TTY: 终端的次要装置号码 (minor device number of tty) 8、STAT 进程当前的状态(“S”:中断 sleeping,进程处在睡眠状态,表明这些进程在等待某些事件发生–可能是用户输入或者系统资源的可用性;“D”:不可中断 uninterruptible sleep;“R”:运行 runnable;“T”:停止 traced or stopped;“Z”:僵死 a defunct zombie process) 9、START 启动命令的时间点 10、TIME 进程执行起到现在总的CPU暂用时间 11、COMMAND 启动这个进程的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ps -ef 
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2014 ? 00:01:28 init [3]
root 2 0 0 2014 ? 00:00:00 [kthreadd]
root 3 2 0 2014 ? 00:00:43 [migration/0]
root 4 2 0 2014 ? 00:07:34 [ksoftirqd/0]
root 5 2 0 2014 ? 00:00:01 [migration/0]
root 6 2 0 2014 ? 00:00:03 [watchdog/0]
root 7 2 0 2014 ? 00:03:04 [migration/1]
root 8 2 0 2014 ? 00:00:01 [migration/1]
root 9 2 0 2014 ? 00:01:44 [ksoftirqd/1]
root 10 2 0 2014 ? 00:00:01 [watchdog/1]
root 11 2 0 2014 ? 00:02:21 [migration/2]
root 12 2 0 2014 ? 00:00:01 [migration/2]

其中显示了:

1、UID 用户号 2、PID 进程ID 3、PPID 父进程号 4、C CPU占用率 5、TTY 终端的次要装置号码 (minor device number of tty) 6、TIME 进程执行起到现在总的CPU暂用时间 7、COMMAND 启动这个进程的命令

一般使用这两个命令的作用是查看预期的进程是否启动,或者杀死指定的进程,例如查看memcached进程是否正常启动:

1
2
3
$ ps -ef | grep 'memcached'
work 14896 5034 0 16:30 pts/12 00:00:00 grep memcached
work 27799 1 0 2014 ? 00:01:08 /home/work/local/memcache/bin/memcached -d -m 8096 -p 11215 -c 256

通过grep命令可以查找指定的进程名称,上面例子查找发现正常运行了,但如果我要关闭这个进程,可以通过杀死PID来完成,例如memcached的PID是27799,那么执行下面kill命令即可:

1
2
3
$ kill 27799
$ ps -ef | grep 'memcached'
work 14896 5034 0 16:30 pts/12 00:00:00 grep memcached

再次查找进程已经消失。

服务管理

服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程。

CentOS 6.0:

1
[root@localhost root] service 服务名 [start | stop | restart | reload | status] 

CentOS 7.0 后不再使用service,而是systemctl

1
[root@localhost root] systemctl [start | stop | restart | reload | status] 服务名

例如修改网络设置后,重启网络设置:

1
[root@localhost root] systemctl restart network.service

查看服务名:查看 /etc/init.d/服务名称

  • 当使用指令关闭或者启用防火墙后,将立即生效。[telnet 测试某个端口即可]
  • 但这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
  • 如果希望设置某个服务自启动或关闭永久生效,要使用chkconfig指令

防火墙管理

查看防火墙状态:

1
2
3
[root@localhost root] systemctl status firewalld

[root@localhost root] systemctl disable firewalld

关闭防火墙:

1
[root@localhost root] systemctl stop firewalld

查看防火墙开放的端口号:

1
[root@localhost root] firewall-cmd --list-all

开放防火墙的某些端口号:

1
2
3
[root@localhost root] firewall-cmd --add-service=http –permanent

[root@localhost root] firewall-cmd --add-port=80/tcp --permanent

重启防火墙:

1
[root@localhost root] firewall-cmd –reload

服务的运行级别(runlevel)

查看或者修改默认级别:vi /etc/inittab

Linux系统有7种运行级别(runlevel):常用的是级别3和5

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS),不支持网络
  • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登陆后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

image-20210806210724476

chkconfig指令

https://cloud.tencent.com/developer/article/1114438

通过chkconfig命令可以给每个服务的各个运行级别设置开机自启动/关闭chkconfig重新设置服务后自启动或关闭,需要重启机器reboot才能生效。

查看服务:

1
2
3
4
5
[root@localhost root] chkconfig --list | grep xxx

[root@localhost root] chkconfig 服务名 --list

[root@localhost root] chkconfig --level 5 服务名 on/off

动态监控进程

topps命令很相似。它们都用来显示正在执行的进程。topps最大的不同之处,在于top在执行一段时间可以更新正在运行的的进程。

1
[root@localhost root] top [选项]
选项 功能
-d 秒数 指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令
-i 使top不显示任何闲置或者僵死进程
-p 通过指定监控进程ID来仅仅监控某个进程的状态

交互操作说明:

操作 功能
P 以CPU使用率排序,默认就是此项
M 以内存的使用率排序
N 以PID排序
q 退出top

应用案例:

案例1. 监视特定用户:

  • 输入top命令,按回车键,查看执行的进程。
  • u:然后输入“u”回车,再输入用户名,即可

案例2:终止指定的进程。

  • 输入top命令,按回车键,查看执行的进程。
  • k:然后输入“k”回车,再输入要结束的进程ID号

监控网络状态

查看系统网络情况netstat

1
[root@localhost root] netstat [选项]

选项说明:

  • -a 显示所有连接信息(包括LISTEN),包括常用于服务器的一些端口监听连接
  • -n 不显示别名信息,用数字代替,可以加快命令的执行速度
  • -p protocol,显示指定网络协议的连接,全部协议在/etc/protocols
  • -v 显示更多信息,可以显示对应连接的PID
  • -r 显示网络路由表信息
  • -L 显示出监听队列的信息

举例:查看监听状态的端口:

1
netstat -an | grep LISTEN

RPM包管理

RPM:一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。Linux的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标准。

一个rpm包名:firefox-45.0.1-1.el6.centos.x86_64.rpm

  • 名称:firefox
  • 版本号:45.0.1-1
  • 适用操作系统: el6.centos.x86_64
  • 表示centos6.x的64位系统
  • 如果是i686、i386表示32位系统,noarch表示通用

查询安装的所有rpm软件包

1
[root@localhost root] rpm –qa | grep xx

查询软件包是否安装

1
[root@localhost root] rpm -q 软件包名

查询软件包信息

1
[root@localhost root] rpm -qi 软件包名

查询软件包中的文件

1
[root@localhost root] rpm -ql 软件包名

查询文件所属的软件包

1
[root@localhost root] rpm -qf 文件全路径名

卸载rpm包

1
[root@localhost root] rpm -e 包的名称

安装rpm包

1
[root@localhost root] rpm -ivh 包全路径名称

参数说明

  • i=install 安装
  • v=verbose 提示
  • h=hash 进度条

YUM包管理

YUM(Yellowdog Updater, Modified)是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

查询yum服务器是否有需要安装的软件

1
[root@localhost root] yum list | grep xx软件列表

安装指定的yum包

1
[root@localhost root] yum install xxx

vi 和 vim

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。

Vim的第一个版本由布莱姆·米勒在1991年发布。最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。现在是在开放源代码方式下发行的自由软件

vi和vim它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。

vim的这些优势主要体现在以下几个方面:

  1. 多级撤消:我们知道在vi里,按u只能撤消上次命令,而在vim里可以无限制的撤消。
  2. 易用性:vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。
  3. 语法加亮:vim可以用不同的颜色来加亮你的代码。
  4. 可视化操作:vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
  5. 对vi的完全兼容:某些情况下,可以把vim当成vi来使用。
  6. vi和vim都是Linux中的编辑器,不同的是vim比较高级,可以视为vi的升级版本。vi使用于文本编辑,但是vim更适用于coding。

vi有3个模式:

  • 插入模式:在此模式下可以输入字符,按ESC将回到命令模式。
  • 命令模式:可以移动光标、删除字符等。
  • 低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。

SHELL 编程

常用的脚本

依次遍历当前目录下的所有子目录,将其中的文件拷贝到当前目录下:

1
2
3
4
5
6
7
8
9
10
 for dir in `ls .`
do
if [ -d $dir ]
then
echo $dir
cd $dir
cp * ..
cd ..
fi
done