前言
最近公司在大力推广DevOps开发运维一体化,作为一名开发人员,不熟悉linux怎么做运维呢,我们虽然是开发,但是基本的linux命令还是要懂得一点的,文章中命令给开发人员部署上线绝对是没问题的;本文章中的所有命令都是在centos7系统下进行测试通过的;
linux目录介绍
玩linux,首先记住一点点:一切皆文件,根目录是/
,所有的文件都在这个目录下
/bin
: bin是Binary的缩写,这个目录存放着最经常使用的命令。/boot
: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev
: dev是Device(设备)的缩写,该目录下存放的是Linux的外部设备,比如U盘/etc
: 这个目录用来存放所有的系统管理所需要的配置文件和子目录。比如nginx和tomcat的配置文件就可以放到这个目录/home
: 用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。/lib
: 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。和java的依赖包一样/lost+found
: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。/media
: linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。/mnt
: 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。比如DVD/VCD就是挂载到mnt的/opt
: 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。/proc
: 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器/root
: 该目录为系统管理员,也称作超级权限者的用户主目录。/sbin
: s就是SuperUser的意思,这里存放的是系统管理员使用的系统管理程序。/selinux
: 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。/srv
: 该目录存放一些服务启动之后需要提取的数据。/sys
:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。/tmp
: 这个目录是用来存放一些临时文件的。/usr
: 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。/usr/bin
: 系统用户使用的应用程序。/usr/sbin
: 超级用户使用的比较高级的管理程序和系统守护程序。/usr/src
: 内核源代码默认的放置目录。/var
: 这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。/run
: 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。/www
:存放服务器网站相关的资源,环境、网站的项目等等
开/关机、重启
数据同步到硬盘
# 将数据由内存同步到硬盘,关机前先做这一步,避免数据丢失
sync
开关机命令
# 立马关机
shutdown -h now
# 10分钟后关机
shutdown -h 10
# 今天20:25关机
shutdown -h 20:25
# 立马重启
shutdown -r now
# 10分钟后重启
shutdown -r +10
# 立马重启
reboot
# 关机
poweroff
关闭系统-但好像不会关机
halt
查看/修改主机名
查看当前主机名
hostname
修改主机名
hostname 主机名
基本命令
目录管理
cd 切换目录
# 进入相对目录
cd xxx
cd ./xxx
# 进入绝对目录
cd /xxx/xxx
# 返回上一个目录
cd ..
# 进入用户目录
cd ~
ls 查看目录
# 列出当前目录下的目录和文件
ls
# 查看当前目录的全部文件-包含隐藏文件
ls -a
# 列出所有文件的详细信息-不包含隐藏文件
# ls -l
pwd 显示当前所在目录
pwd
mkdir 创建目录
mkdir 目录名称
rmdir 删除目录
# -p表示连同子目录一起删除
rmdir -p 目录名称
rm 删除文件或目录
# -r 递归删除,表示连同子目录一起删除,
# -f表示不需要确认,强制删除
rm -rf 文件名/目录名称
cp 复制文件或目录
cp 原文件地址 新目录
cp /root/nginx.conf /home
# 如果是复制目录,需要加上-r参数
cp -r /原目录 /新目录
mv 移动文件或目录
# -u 只替换已经更新的文件
# -f 强制移动
mv -fu /源文件 /新目录
touch 创建文件
touch 文件名
看懂文件属性
当我们查看目录时会使用ls -l命令,显示内容都表示什么呢?
[root@localhost /]# ls -l
total 16
lrwxrwxrwx. 1 root root 7 Sep 15 10:09 bin -> usr/bin
第一项
第一个字母
- d:d表示该文件是一个目录,字母”d”,是dirtectory(目录)的缩写
- l:l表示该文件是一个软链接文件。字母”l”是link(链接)的缩写,类似于windows下的快捷方式
- -:表示是一个硬链接文件
- b:b的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)
- c:c表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节
- p:p表示该文件为命令管道文件。与shell编程有关的文件
- s:s表示该文件为sock文件。与shell编程有关的文件
接下来的字符
接下来的字符每三个为一组
- r:表示读权限
- w:表示写权限
x:表示执行权限
第一组为属主权限,谁创建的谁就是主
- 第二组为属于组权限
- 第三组为其他用户的权限
第二项
第二项是文件个数,我们看到第二项显示的是1,表示里面只有一个文件
lrwxrwxrwx. 1 root root 7 Sep 15 10:09 bin -> usr/bin
第三项 和 第四项
我们看到第三项和第四项都是root,
第三项是属主,也就是谁创建的,
第四项是属组,也就是属于哪个用户组,
第五项
文件大小
第六项
创建时间
修改文件属性
charp:更改文件组
- R 递归修改文件属组
charp -R 属组名 文件名
chmod 修改文件的9个权限
# r 表示第一组的权限
# w 表示第二组的权限
# x 表示第三组的权限
chmod -R rwx 文件名
# 除了用字母表示,也可以使用数字来表示
# r 用4表示
# w 用2表示
# x 用1表示
# 设置最高权限
chmod 777 文件名
# 设置可读可写
chmod 666 文件名
# 设置只读
chmod 444 文件名
# 设置只写
chmod 222 文件名
# 设置只能执行
chmod 111 文件名
文件夹内容查看
cat 顺序查看
cat 文件名
tac 倒序查看
tac 文件名
nl 查看时输出行号
nl 文件名
more 一页页地显示
more只能往下翻页,不能往上翻
more 文件名
# 快捷键
空格键 : 下一页
回车:看下一行
:f 查看行号
less 一页页显示
less可以往下翻页,也能往上翻
less 文件名
# 快捷键
上键 :向上翻页
下键 :向下翻页
q:退出
head 只看头几行
# 只看前20行
head -n 20 文件名
tail 看尾部几行
tail -n 20 文件名
# 持续跟踪文件,输出新内容
tail -f 文件名
软链接和硬链接
软链接
类似windows下的快捷方式,删除了源文件的话,软链接也无法访问;删除软链接不会影响源文件
ln -s 源文件 软链接
添加软链接后会有个箭头->
lrwxrwxrwx. 1 root root 7 Sep 15 10:09 bin -> usr/bin
lrwxrwxrwx. 1 root root 7 Sep 15 10:09 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Sep 15 10:09 lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 Sep 15 10:09 sbin -> usr/sbin
硬链接
2个文件指向同一个文件,相当于一个文件拥有多个路径;比如A文件和B文件都指向同一个文件,不管删除A还是B,都不会删除源文件,可以有效防止误删
ln 源文件 硬链接
vi/vim 编辑器
vim fileName
vi fileName
命令模式
x # 删除光标所在的文字
i # 进入编辑模式,可修改文件内容
a # 进入编辑模式,可修改文件内容
o # 进入编辑模式,可修改文件内容
v # 进入可视模式, 在可视模式下,移动光标可以选择文本, 总是整行整行的选中
ctrl + v # 进入可视块模式,之后使用 j/k/h/l键可以选中一块
ctrl + f # 向下移动一页
ctrl + b # 向上移动一页
ctrl + d # 向下移动半页
ctrl + u # 向上移动半页
r # 替换模式,可替换光标处的字符
n + 回车 # n为数字,光标向下移动n行
dd # 删除行
gg # 移动到文件的首行
shift + g # 移动到文件的尾行
n + shift + g # n为数字,移动到文件的第n行,先输入行号n,然后shift + g一起按
/xx # 查询文件内容,xx为你需要查询的关键字,如果查询到会有多个关键字,n 往下寻找,N 往上寻找
?xx # 光标之上查询内容,xx为你需要查询的关键字
eas # 从编辑模式返回到命令模式
esc + : # 切换到底线命令模式
输入/编辑模式
# 正常输入字符
enter # 回车换行
底线命令模式
:q # 退出程序
::w # 保存文件
:w fileName # 保存为指定文件
:q! # 不保存文件并退出
:qw! # 强制保存退出,忽略只读属性
:w! # 强制保存,
:set nu # 显示行号
:set nonu # 取消行号
账号管理
linux系统是一个多任务的分时操作系统,在使用资源时需要申请一个账号,在多人同时操作linux系统时,可以给部门的人每人申请一个账号供其使用
添加账号
# 创建账号
useradd -选项 用户名
# 选项说明
-m : 使用者目录不存在时自动创建
-c comment :给用户一段描述字符串,随便写
-d /目录:指定用户主目录
-g 用户组 :指定用户所属的用户组
-G 用户组 :指定用户所属的附加组
-s shell文件 : 指定用户登录的shell
-u 用户号: 指定用户的用户号,
添加后就可以在passwd文件内看到刚刚创建的用户了
# 后面的 | grep yexindong -0 表示查询yexindong这个字符串, -0 表示只显示一行
[root@localhost yexindong]# cat /etc/passwd | grep yexindong -0
yexindong:x:1000:1000::/home/yexindong:/bin/bash
修改用户
# 修改用户的选项和添加用户一致
usermod -选项 用户名
修改密码
# 密码长度必须大于8,设置密码时需要确认密码
passwd 用户名
删除用户
# -r 表示删除用户后将用户目录也一起删除, -f 表示强制删除
userdel -rf 用户名
切换用户
# 注意,在切换用户时,用户主目录必须已存在,否则无法使用目录
su user_name
锁定账户
# -l 是lock 的简写,锁定后就无法登录了
passwd -l 用户名
# -d 是去掉密码,没有密码的情况下也无法登录;
passwd -d 用户名
用户组管理
用户组的增删改,其实就是对/etc/group
文件的更新
创建用户组
groupadd 选项 组名称
# 选项
-g id: 指定组的id,如果不指定,默认自增id
修改用户组
groupmod 选项 组名称
# 选项
-g id: 指定组的id,如果不指定,默认自增id
-n name : 修改组名
删除用户组
groupdel 组名称
切换用户组
# 1、登录当前用户
su 用户名
# 2、切换用户组
newgrp 组名
# 当然,最好的方式是创建用户的时候就添加一个用户组
useradd -g 组名 用户名
磁盘管理
列出磁盘整体使用量
df 选项
# 选项
-m :以MB单位显示
-g :以GB为单位显示
-k :以KB为单位显示(默认)
df命令展示说明
当我们输入df
命令时会展示以下内容
[yexindong@yexindong root]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 495612 0 495612 0% /dev
tmpfs 507572 0 507572 0% /dev/shm
tmpfs 507572 7304 500268 2% /run
tmpfs 507572 0 507572 0% /sys/fs/cgroup
/dev/mapper/centos-root 28289540 1662604 26626936 6% /
/dev/sda1 1038336 139160 899176 14% /boot
tmpfs 101516 0 101516 0% /run/user/0
tmpfs 101516 0 101516 0% /run/user/1000
# 说明
Filesystem :文件系统
1K-blocks :空间 (单位:KB)
Used :已使用空间
Available : 未使用
Use% :使用率
Mounted on : 挂载的目录 (这个相当于windows的C盘、D盘)
检查当前目录的磁盘空间使用量
cd /home
# 查看home目录的使用情况; -a 可查看子目录的情况
du -a
挂载目录
# 将 /dev/yexindong 挂载到 /mnt/yexindong目录下
mount /dev/yexindong /mnt/yexindong
卸载目录
# -f 表示强制卸载
unmount -f 挂载位置
进程管理
- 在linux中,每一个程序都有自己的进程,每一个进程都有一个id号,
- 每一个进程都有一个父进程,代表着是谁创建的
- 进程可以有2中存在方式,前台和后台
ps 查看当前系统正在执行的进程信息
ps 选项
# 选项
-a :显示当前进程信息
-u :以用户的信息显示进程
-x :显示所有后台运行的进程参数
ps -ef
和 ps -aux
的区别
其实这2个命令显示的信息都是差不多的,但是ps -ef
可以看到父进程的信息;
查看父进程也可以用pstree
命令;但是centos默认不支持pstree,可以先安装yum install psmisc -y
[root@yexindong ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─3*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─nm-dispatcher───2*[{nm-dispatcher}]
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd
结束进程
# 终端短线
kill -1 pid
# 中断,相当于按下快捷键 ctrl + C
kill -2 pid
# 退出,相当于按下快捷键 ctrl + \
kill -3 pid
# 强制停止进程
kill -9 pid
# 操作系统发送一个通知告诉应用主动关闭.
kill -15 PID
# 继续执行,(与19相反)
kill -18 pid
# 暂停,相当于按下快捷键 ctrl + Z
kill -19 pid
安装软件
linux系统安装软件有三种方式
- rpm安装
- 解压缩安装
- yum在线安装
1、rpm安装
执行以下命令就已经安装好了,但是还未配置环境变量
rpm -ivh rpm包
# 选项
-i:表示安装,--install的简写
-v:表示显示详细信息
-h:以#号来显示安装进度,--hash的简写,就像这样:################################# [100%]
-q : 查询指定包名,--query 的简写
-e:卸载指定包名,
-U:升级软件
-F:升级软件
-V:对rpm包进行验证
--nodeps:忽略依赖关系
–test:仅作测试,不真正执行,可用于测试安装,测试卸载。
–replacepkgs:重新安装。替换原有的安装。
–force:忽略软件包及文件的冲突。
–initdb:新建RPM的数据库。
–rebuilddb:重建RPM的数据库。
–percent:以百分比的形式输出安装的进度。
rpm卸载
这里用卸载JDK来示例
# 先查询有哪些jdk
[root@yexindong ~]# rpm -qa | grep jdk
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-devel-1.8.0.302.b08-0.el7_9.x86_64
java-1.8.0-openjdk-headless-1.8.0.302.b08-0.el7_9.x86_64
java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64
# 然后依次删除
rpm -e --nodeps copy-jdk-configs-3.3-10.el7_5.noarch
rpm -e --nodeps java-1.8.0-openjdk-devel-1.8.0.302.b08-0.el7_9.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.302.b08-0.el7_9.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64
2、tar.gz 解压缩安装
直接解压即可
tar -zvxf xxx.tar.gz
3、yum在线安装
centos默认是自带yum的,如果是debain系统,默认自带的是apt-get的在线安装程序;
使用yum在线安装时,电脑必须联网,无网络的情况下是无法安装软件的
安装
安装时会询问你Is this OK[y/d/N]
,需要你手动进行选择。但是如果加上参数-y
,就会自动选择y,不需要你再手动选择!
yum -y install xxxx
在线模糊搜索字符串相关的软件
yum search xxx
卸载
yum remove xxxx
更新
yum update xxx
列出所有可安装的软件包
yum list
列出所有可更新的软件包
yum list updates
列出所有可更新的软件包信息
yum info updates
列出所有已安装的软件包
yum list installed
列出所有已安裝的软件包信息
yum info installed
配置环境变量
第一种方式
仅对当前会话临时生效
export PATH=/usr/local/java/bin
第二种方式
仅对当前用户永久生效
# 编辑文件
vim ~/.bash_profile
# 在文件中加入以下内容
JAVA_HOME=/usr/local/java/jdkxxx
CLASSPATH=%JAVA_HOME%/lib;%JAVA_HOME%/jre/bin
PATH=$JAVA_HOME/bin
export PATH CLASSPATH JAVA_HOME # 导出,让系统能识别
# 让环境变量生效
source ~/.bash_profile
第三种方式
对系统所有用户永久生效
# 编辑文件
vim /etc/profile
# 在文件中加入以下内容
JAVA_HOME=/usr/local/java/jdkxxx
CLASSPATH=%JAVA_HOME%/lib;%JAVA_HOME%/jre/bin
PATH=$JAVA_HOME/bin
export PATH CLASSPATH JAVA_HOME # 导出,让系统能识别
# 让环境变量生效
source /etc/profile
查看软件安装路径
使用如下命令即可查看java的安装目录
whereis java
防火墙
安装防火墙
默认的centos没有防火墙,所以我们安装一下
yum install firewalld
启动防火墙
systemctl start firewalld
查看状态
通过命令可以看到防火墙是正在运行中的状态
[root@yexindong ~]# firewall-cmd --state
running
# 也可以通过以下命令查看运行状态,但是显示信息有点多
systemctl status firewalld
关闭防火墙
systemctl stop firewalld
重启
firewall-cmd --reload
开机启用/禁用
# 开机启用
systemctl enable firewalld
# 开机禁用
systemctl disable firewalld
查看开放的端口
firewall-cmd --list-ports
开启防火墙端口
开启后,外部就可以访问这个端口了;
# –permanent 表示永久生效,没有此参数重启后会失效
# --zone 表示作用域
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 添加的端口重启后才会生效
firewall-cmd --reload
后台运行
nohup
先写一个脚本print.sh
,每秒打印一个123,一直循环打印下去
!/bin/sh
while [ true ]; do
/bin/sleep 1
echo 123
done
运行
# 后台运行,将打印结果保存到print.out文件中
nohup ./print.sh > print.out &