Linux基础命令
Linux基础命令
查看系统情况
cpu使用情况
top
分别看每个核的占用 按1
查看内存使用情况
free -h
查看端口占用情况
任选其一
ss -ltnp | grep 端口号 # 监听中的 TCP
ss -atunp | grep 端口号 # 所有 TCP/UDP
lsof -i :端口号
netstat -tunlp | grep 端口号
tulpn
是 netstat
和 ss
命令的选项组合,每个字母代表一个不同的选项:
t
: 显示 TCP 连接u
: 显示 UDP 连接l
: 仅显示监听中的连接(listening)p
: 显示使用该连接的进程名称和 PID(进程 ID)n
: 以数字形式显示地址和端口号,而不是尝试解析为主机名和服务名
查看磁盘使用情况
df -h
查找大文件
find . -type f -exec du -h {} + | sort -rh | head -n 20
杀进程
通过pid杀掉进程
kill -15 19475
1 | kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] |
sigspec:信号声明
signum:信号编号
信号声明和信号编号相应关系以及解释如下表格:
Signal Name | Number | Description |
---|---|---|
SIGHUP | 1 | Hangup (POSIX) |
SIGINT | 2 | Terminal interrupt (ANSI) |
SIGQUIT | 3 | Terminal quit (POSIX) |
SIGILL | 4 | Illegal instruction (ANSI) |
SIGTRAP | 5 | Trace trap (POSIX) |
SIGIOT | 6 | IOT Trap (4.2 BSD) |
SIGBUS | 7 | BUS error (4.2 BSD) |
SIGFPE | 8 | Floating point exception (ANSI) |
SIGKILL | 9 | Kill(can’t be caught or ignored) (POSIX) |
SIGUSR1 | 10 | User defined signal 1 (POSIX) |
SIGSEGV | 11 | Invalid memory segment access (ANSI) |
SIGUSR2 | 12 | User defined signal 2 (POSIX) |
SIGPIPE | 13 | Write on a pipe with no reader, Broken pipe (POSIX) |
SIGALRM | 14 | Alarm clock (POSIX) |
SIGTERM | 15 | Termination (ANSI) |
SIGSTKFLT | 16 | Stack fault |
SIGCHLD | 17 | Child process has stopped or exited, changed (POSIX) |
SIGCONT | 18 | Continue executing, if stopped (POSIX) |
SIGSTOP | 19 | Stop executing(can’t be caught or ignored) (POSIX) |
SIGTSTP | 20 | Terminal stop signal (POSIX) |
SIGTTIN | 21 | Background process trying to read, from TTY (POSIX) |
SIGTTOU | 22 | Background process trying to write, to TTY (POSIX) |
SIGURG | 23 | Urgent condition on socket (4.2 BSD) |
SIGXCPU | 24 | CPU limit exceeded (4.2 BSD) |
SIGXFSZ | 25 | File size limit exceeded (4.2 BSD) |
SIGVTALRM | 26 | Virtual alarm clock (4.2 BSD) |
SIGPROF | 27 | Profiling alarm clock (4.2 BSD) |
SIGWINCH | 28 | Window size change (4.3 BSD, Sun) |
SIGIO | 29 | I/O now possible (4.2 BSD) |
SIGPWR | 30 | Power failure restart (System V) |
每一个信号量都有对应的信号声明和信号编号,比如 9) SIGKILL ,那么我们可以使用下面任何一种命令来强制终止进程(假设进程 ID 为1760)。因为信号声明前缀都是 SIG ,所以也可以省略前缀。
1 | kill -9 1760 |
如果没有显示指定具体的信号,默认是 15) SIGTERM。当程序接收到此信号后,程序会做停止前的处理工作,例如释放相应的资源,然后再停止,但是程序有可能会继续运行着。即 SIGTERM 信号是可以被阻塞的,可能被忽略的。
1 | # 两种等效 |
使用 kill 命令终止一个进程,后面需要跟参数 pid | jobspec …,可以是程序的 PID,PGID,或者工作编号等。
1 | # 1755 是进程ID |
所以比较合理的处理方式是应该先用默认信号(15) SIGTERM 尝试停止服务,如果多次尝试未停止成功,再考虑使用强制信号(9) SIGKILL 终止服务。
Kill -9 和Kill -15 有什么区别
kill -9 PID 是操作系统从内核级别强制杀死一个进程.
kill -15 PID 可以理解为操作系统发送一个通知告诉应用主动关闭.
所以当我们执行 kill pid 命令时,JVM 接收到关闭指令,会发布一些关闭事件,监听事件的监听器就可以在关闭服务前做相应的处理;也会触发注册的所有 Shutdown Hook,从而实现优雅停止服务。
查看历史命令
1 | history(选项)(参数) |
选项
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。
|grep (关键词) :过滤 仅显示包含关键词的命令==history|grep mysql==
参数
n:打印最近的n条历史命令。
监听服务端口自动重启服务
1 |
|
参考:
https://blog.csdn.net/YANGMING1234ym/article/details/86533734
Crontab 定时执行脚本
1 | #查看定时任务状态 |
https://www.cnblogs.com/hally/p/13549920.html
压缩/解压缩
介绍几个常用的参数
-c 指定为压缩模式
-x 指定为解压模式
-v 显示执行过程
-z 使用gzip压缩
-f 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
压缩
==tar -zcvf 压缩包文件名.tar.gz 要压缩的文件名 空格隔开==
tar -zcvf 压缩包文件名.tar.gz 要压缩的目录
解压
==tar -xvf 压缩包名称==
https://blog.csdn.net/weixin_44901564/article/details/99682926
Linux常见错误
Linux环境下执行脚本时报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
一、问题描述
我在Windows 10 系统下编辑了一个发送消息到企业微信的shell脚本文件,然后copy到了远程的Linux服务器,当运行的时候报错了。
如下所示:
root@ubuntu116:/data/gitlabData/auto_back_shell# ./qiyewechat-notifier.sh
-bash: ./qiyewechat-notifier.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
root@ubuntu116:/data/gitlabData/auto_back_shell#
二、错误原因
这个文件在Windows 下编辑过,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以才会有 多出来的\r。
三、修改错误
使用指令sed -i ‘s/\r$//‘ xxxxxxx.sh,上面的指令会把 xxxxxxx.sh 中的\r 替换成空白!
然后再次执行./xxxxx.sh 完成
原文连接: https://blog.csdn.net/ouyang_peng/article/details/86488451
Linux使用教程
修改默认登录端口22
1 | vim /etc/ssh/sshd_config |
通过ssh秘钥登录服务器
1 | eai@eai:~/.ssh$ ssh-keygen <====== 建立密钥对 |
引用连接:
Windows下 SSH 通过密钥登录 Linux 服务器_The Dawn-CSDN博客
CentOS7.4配置SSH登录密码与密钥身份验证踩坑 - Leroscox - 博客园
shell脚本
常见错误
shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected)
http://www.blogdaren.com/post-2189.html
Bash脚本的空格和“期待一元表达式”错误
https://blog.csdn.net/qinxiandiqi/article/details/41626215
文本处理
vim文本编辑器
vim代码有高亮
文本编辑器的三种操作模式
vim有三种操作模式,分别是命令模式(Command mode)、输入模式(Insert mode)和底线命令模式(Last line mode)。
三种模式切换快捷键:
模式 | 快捷键 |
---|---|
命令模式 | ESC |
输入模式 | i或a |
底线命令模式 | : |
==命令模式:== |
在命令模式中控制光标移动和输入命令,可对文本进行复制、粘贴、删除和查找等工作。
使用命令vim filename后进入编辑器视图后,默认模式就是命令模式,此时敲击键盘字母会被识别为一个命令,例如在键盘上连续敲击两次d,就会删除光标所在行。
以下是在命令模式中常用的快捷操作:
操作 | 快捷键 |
---|---|
光标左移 | h |
光标右移 | l(小写L) |
光标上移 | k |
光标下移 | j |
光标移动到下一个单词 | w |
光标移动到上一个单词 | b |
移动游标到第n行 | nG |
移动游标到第一行 | gg |
移动游标到最后一行 | G |
快速回到上一次光标所在位置 | Ctrl+o |
删除当前字符 | x |
删除前一个字符 | X |
删除整行 | dd |
删除一个单词 | dw或daw |
删除至行尾 | d$或D |
删除至行首 | d^ |
删除到文档末尾 | dG |
删除至文档首部 | d1G |
删除n行 | ndd |
删除n个连续字符 | nx |
将光标所在位置字母变成大写或小写 | ~ |
复制游标所在的整行 | yy(3yy表示复制3行) |
粘贴至光标后(下) | p |
粘贴至光标前(上) | P |
剪切 | dd |
交换上下行 | ddp |
替换整行,即删除游标所在行并进入插入模式 | cc |
撤销一次或n次操作 | u{n} |
撤销当前行的所有修改 | U |
恢复撤销操作 | Ctrl+r |
整行将向右缩进 | >> |
整行将向左退回 | << |
若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开 | ZZ |
输入模式:
在命令模式下按i或a键就进入了输入模式,在输入模式下,您可以正常的使用键盘按键对文本进行插入和删除等操作。
底线命令模式:
在命令模式下按:键就进入了底线命令模式,在底线命令模式中可以输入单个或多个字符的命令。
以下是底线命令模式中常用的快捷操作:
操作 | 命令 |
---|---|
保存 | :w |
退出 | :q |
保存并退出 | :wq( :wq! 表示强制保存退出) |
将文件另存为其他文件名 | :w new_filename |
显示行号 | :set nu |
取消行号 | :set nonu |
使本行内容居中 | :ce |
使本行文本靠右 | :ri |
使本行内容靠左 | :le |
向光标之下寻找一个名称为word的字符串 | :/word |
向光标之上寻找一个字符串名称为word的字符串 | :?word |
重复前一个搜寻的动作 | :n |
从第一行到最后一行寻找word1字符串,并将该字符串取代为word2 | :1,$s/word1/word2/g 或 :%s/word1/word2/g |
VI文本编辑器
字符串查找
自上而下查找一个字符串使用:“/你要查询的内容”
自下而上查找一个字符串使用:”?要查询的内容”
查找下一个 :“/你要查询的内容” 再输入”n“跳到下一个 输入”N”跳到上一个
==ctrl+f== 翻页 ==ctrl+b==向上翻页
==shift+g== 翻页到末尾
字符串替换
文件内全部替换:
==:%s#abc#def#g==(用def替换文件中所有的abc)
例如把一个文本文件里面的“linuxidc.com”全部替换成“linuxidc.net”:
==:%s#linuxidc.com#xwen.net#g== (如文件内有#,可用/替换,比如:%s/linuxidc.com/xwen.net/g)
b. 文件内局部替换:
把10行到50行内的“abc”全部替换成“def”
==:10,50s#abc#def#g==(如文件内有#,可用/替换,:%s/abc/def/g)
以上命令如果在g后面再加上c,则会在替换之前显示提示符给用户确认(conform)是否需要替换。 比如
==:%s#linuxidc.com#linuxidc.net#gc==
文本文件查看命令
cat 适合小文件
命令描述:cat命令用于查看内容较少的纯文本文件。
命令格式:cat [选项] [文件]。
命令参数说明:
参数 | 说明 |
---|---|
-n或–number | 显示行号 |
-b或–number-nonblank | 显示行号,但是不对空白行进行编号 |
-s或–squeeze-blank | 当遇到有连续两行以上的空白行,只显示一行的空白行 |
more 适合大文件
命令描述:more命令从前向后分页显示文件内容。
常用操作命令:
操作 | 作用 |
---|---|
Enter | 向下n行,n需要定义,默认为1行 |
Ctrl+F或空格键(Space) | 向下滚动一页 |
Ctrl+B | 向上滚动一页 |
= | 输出当前行的行号 |
!命令 | 调用Shell执行命令 |
q | 退出more |
命令使用示例: | |
从第20行开始分页查看系统日志文件/var/log/messages。 |
1 | more +20 /var/log/messages |
less 适合大文件
命令描述:less命令可以对文件或其它输出进行分页显示,与moe命令相似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动。
命令格式:less [参数] 文件 。
命令参数说明:
参数 | 说明 |
---|---|
-e | 当文件显示结束后,自动离开 |
-m | 显示类似more命令的百分比 |
-N | 显示每行的行号 |
-n | 不显示行号,打开大文件能有效加快速度 |
-s | 显示连续空行为一行 |
+G | 打开文件直接定位到文件尾部,默认在头部 |
命令常用操作: |
快捷键 | 说明 |
---|---|
/字符串 | 向下搜索字符串 |
?字符串 | 向上搜索字符串 |
n | 重复前一个搜索 |
N | 反向重复前一个搜索 |
b或pageup 键 |
向上翻一页 |
空格键或pagedown 键 |
向下翻一页 |
u | 向前翻半页 |
d | 向后翻半页 |
y | 向前滚动一行 |
回车键 | 向后滚动一行 |
q | 退出less命令 |
命令使用示例: | |
查看命令历史使用记录并通过less分页显示。 | |
history | less |
head 前几行
命令描述:head命令用于查看文件开头指定行数的内容。
命令格式:head [参数] [文件]。
命令参数说明:
参数 | 说明 |
---|---|
-n [行数] | 显示开头指定行的文件内容,默认为10 |
-c [字符数] | 显示开头指定个数的字符数 |
-q | 不显示文件名字信息,适用于多个文件,多文件时默认会显示文件名 |
命令使用示例:
查看/etc/passwd文件的前5行内容。
head -5 /etc/passwd
tail 实时查看
命令描述:tail命令用于查看文档的后N行或持续刷新内容。
命令格式:tail [参数] [文件]。
命令参数说明:
参数 | 说明 |
---|---|
-f | 显示文件最新追加的内容 |
-q | 当有多个文件参数时,不输出各个文件名 |
-v | 当有多个文件参数时,总是输出各个文件名 |
-c [字节数] | 显示文件的尾部n个字节内容 |
-n [行数] | 显示文件的尾部n行内容 |
命令使用示例:
查看/var/log/messages系统日志文件的最新10行,并保持实时刷新。
tail -f -n 10 /var/log/messages
按ctrl+c键退出文本实时查看界面。
原理:tail -f
命令通过以下事件来实现对文件的实时监控:IN_MODIFY
:文件内容被修改IN_ATTRIB
:文件元数据被修改IN_DELETE_SELF
:文件自身被删除IN_MOVE_SELF
:文件自身被移动
命令会在检测到上述事件时阻塞并等待这些事件的发生,从而实现对文件内容的实时刷新。
通过这种方式,用户可以实时监控文件的变化,尤其适用于日志文件的监控。
stat 详细信息
命令描述:用来显示文件的详细信息,包括inode、atime、mtime、ctime等。
命令使用示例:
查看/etc/passwd文件的详细信息。
stat /etc/passwd
wc 统计
命令描述:wc命令用于统计指定文本的行数、字数、字节数。
命令格式:wc [参数] [文件]。
命令参数说明:
参数 | 说明 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
file
命令描述: file命令用于辨识文件类型。
命令格式:file [参数] [文件]。
命令参数说明:
参数 | 说明 |
---|---|
-b | 列出辨识结果时,不显示文件名称 |
-c | 详细显示指令执行过程,便于排错或分析程序执行的情形 |
-f [文件] | 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称 |
-L | 直接显示符号连接所指向的文件类别 |
diff
命令描述:diff命令用于比较文件的差异。
文本文件处理命令
grep
命令描述:grep命令用于查找文件里符合条件的字符串。
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它能使用正则表达式搜索文本,并把匹配的行打印出来。
在Shell脚本中,grep通过返回一个状态值来表示搜索的状态:
0:匹配成功。
1:匹配失败。
2:搜索的文件不存在。
命令格式:grep [参数] [正则表达式] [文件]。
命令常用参数说明:
参数 | 说明 |
---|---|
-c或–count | 计算符合样式的列数 |
-d recurse或-r | 指定要查找的是目录而非文件 |
-e [范本样式] | 指定字符串做为查找文件内容的样式 |
-E 或 –extended-regexp | 将样式为延伸的正则表达式来使用 |
-F 或 –fixed-regexp | 将样式视为固定字符串的列表 |
-G 或 –basic-regexp | 将样式视为普通的表示法来使用 |
-i 或 –ignore-case | 忽略字符大小写的差别 |
-n 或 –line-number | 在显示符合样式的那一行之前,标示出该行的列数编号 |
-v 或 –revert-match | 显示不包含匹配文本的所有行 |
命令使用示例:
查看sshd服务配置文件中监听端口配置所在行编号。
grep -n Port /etc/ssh/ssh_config
查询字符串在文本中出现的列数。
grep -c localhost /etc/hosts
反向查找,不显示符合条件的行。
ps -ef | grep -v grep | grep sshd
以递归的方式查找目录下含有关键字的文件。
grep -r *.sh /etc
sed
命令描述:sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。
- 处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space)。
- 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
- 接着处理下一行,这样不断重复,直到文件末尾。
注意:
sed命令不会修改原文件,例如删除命令只表示某些行不打印输出,而不是从原文件中删去。
如果要改变源文件,需要使用-i选项。
命令格式:sed [参数] [动作] [文件]。
参数说明:参数 说明 -e [script] 执行多个script -f [script文件] 执行指定script文件 -n 仅显示script处理后的结果 -i 输出到原文件,静默执行(修改原文件) 动作说明:
动作 | 说明 |
---|---|
a | 在行后面增加内容 |
c | 替换行 |
d | 删除行 |
i | 在行前面插入 |
p | 打印相关的行 |
s | 替换内容 |
tr
命令描述:tr命令用于对来自标准输入的字符进行替换、压缩和删除。
命令格式:tr [参数] [文本]。
参数说明:
参数 | 说明 |
---|---|
-c | 反选指定字符 |
-d | 删除指定字符 |
-s | 将重复的字符缩减成一个字符 |
-t [第一字符集] [第二字符集] | 删除第一字符集较第二字符集多出的字符,使两个字符集长度相等 |
查询软件安装位置
1 | $ which java #查看java位置 |
升级内置python版本
linux系统升级python版本看起来复杂,如果知道其中步骤也不会觉得很困难。下面记录在deepin系统 15.11和ubuntu16.04系统下将python从2.7升级到3.7过程
1 | ## 使用普通用户完成以下操作: |
screen简单用法
yum install screen
常用的screen命令:
1、screen -S name 创建 名为name的 screen
2、ctal+a 然后 按d 暂时离开此screen 后台继续运行
3、screen -ls 列出所有screen 进程 pid 与名称
4、screen -r + pid(或者名称)回到screen(attached状态),如果就一个screen进程,可以省略 pid
结束一个session有两种方法
一种是,通过screen -r pid 或者 screen -r name先进入该session中,然后exit即可
一种是,通过screen -S edm_10000 -X quit命令,不进入该session中,直接退出
centos解决screen状态为Attached连上不的问题
screen -D -r 25372
#解释:-D -r 先踢掉前一用户,再登陆。
使用:
创建screen后 进入该screen任务,然后运行程序,可以退出到shell 干其他事了,
最主要的功能是screen不会因为断网或者关闭ssh而结束了之前运行的程序
curl
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
SFTP
链接sftp:
1 | #登录 |
Crontab 定时任务
简单使用
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作作)
我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。
例如
1 | */5 * * * * sh /usr/local/qcloud/stargate/admin/start.sh |
左边*/5 * * * *
是cron表达式
CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。
注释以注释标记#开始,并且必须单独在一行上。
Linux: 0 */12 * * *
Java(Spring): 0 0 */12 * * *
Java(Quartz): 0 0 18 L * ?
0 8 * * * sh /root/back.sh 每日八点执行
右边sh /usr/local/qcloud/stargate/admin/start.sh
要执行的命令
查看定时任务执行日志:
1 | tail -f /var/log/cron |
设置时区
timedatectl list-timezones
列出系统所有可用时区sudo timedatectl set-timezone Asia/Shanghai
设置时区timedatectl
查看当前时区
/dev/null
/dev/null
是一个特殊的设备文件,所有接收到的数据都会被丢弃。
从 /dev/null
读数据会立即返回 EOF(0,文件结束标志).
编写需要交互输入的sh脚本
简单的方法,使用echo:
1 | echo yes | needInputYes.sh |
如果上面的不行,试试使用expect
专门用来交互自动化的工具
1 | #yum install expect |
进程与文件描述符 fd
一个进程启动以后,除了会分配堆、栈空间以外,还会默认分配三个文件描述符句柄:0 号标准输入(stdin)、1 号标准输出(stdout)、2 号错误输出(stderr)
使用ls查询进程打开的文件描述符 ls -l /proc/[PID]/fd
文件描述符与重定向
标准输入、标准输出、错误输出在描述符中的位置不会变化,但是它们的指向是可以改变的,我们用到的重定向操作符 >
和 <
就是用来重定向数据流的。
在 shell 脚本中,经常看到 2>&1
这样的重定向操作。
2>
表示重定向标准错误输出 (stderr)。&1
表示标准输出 (stdout)。
连起来的含义是将标准错误输出 (stderr) 重定向到与标准输出 (stdout) 相同的地方。例如,将标准输出和标准错误输出都重定向到一个文件,可以这样写:command > output.log 2>&1
这表示将command
的标准输出和标准错误输出都写入output.log
文件。
这种重定向方式在脚本和命令行中非常常见,用于将程序的所有输出记录到日志文件中,便于调试和分析。
ref:https://cloud.tencent.com/developer/article/2002926?areaId=106001
安装java+切换java版本
1 | # 更新软件包列表 |
防火墙设置
UFW(Ubuntu默认)
1.检查状态sudo ufw status
如果提示 command not found
,可以用以下命令安装:
1 | sudo apt install ufw |
2.启用防火墙
先放开22端口sudo ufw allow 22
然后启用防火墙sudo ufw enable
启用后,默认会阻止所有传入的连接,允许所有传出的连接。注意一定要先放开22端口再开启!否则SSH链接可能会断开,之后就无法远程操作了(本地物理机无所谓)。
3.基础使用
查看防火墙状态和规则 sudo ufw status
禁用防火墙 sudo ufw disable
禁止某个端口链接 sudo ufw deny 23
开放某个端口 sudo ufw allow 22
允许特定 IP 访问某端口 sudo ufw allow from 192.168.1.100 to any port 22
删除防火墙规则 sudo ufw delete allow 22
重启防火墙 sudo ufw reload
安装nodejs
前往官网Node.js — Download Node.js®选择系统版本等即可.
如果服务器没外网则可get a prebuilt Node.js点击独立文件按钮下载,一般linux是.xz文件.
然后rz上传到服务器,如果rz未下载apt install lrzsz
.
然后解压tar -xvf node-v14.15.1-linux-x64.tar
然后配置软链接
1 | # 创建 node 和 npm 的符号链接 |
然后就安装完成!