linux 命令手册
[TOC]

Linux 文档

man

1
# man 是一个 Linux 命令手册大全
2
man ls
3
man head
4
man man
5
man -k keyword # 按照关键字查找相关的命令手册
Copied!

--help

1
# 大多数命令都支持 --help 参数, --help 相当于手册的精简版,会列出几个重要的命令参数
2
ls --help
3
cat --help
Copied!

Linux 术语

console,terminal,tty,shell

console 是电脑的控制台,一台电脑只有一个 console;
一台大型主机往往需要支持许多用户同时使用,每个用户所使用操作的设备,叫做 Terminal
tty(Teletypewriter)电传打字机,是最流行的 Terminal;
shell 是一个交互式软件,用于用户和操作系统进行交互,用户在 Terminal 上登陆后,就会进入 shell;

shell Tricks

1
# 换行,注意换行第二行不要带空格!
2
/ + 回车
3
4
# 显示当前时间
5
date
6
7
# 展示所有的命令可能
8
tab + tab
9
10
# 终端快捷键
11
tab # 自动补全
12
ctrl + a # 光标移到行首 head
13
ctrl + e # 光标移到行末 end
14
esc + . # 复用上一条命令的参数
15
ctrl + r # 从 history 中模糊匹配执行的命令 键入 ctrl + r 后,输入相关的命令,一边输入,会一边进行匹配 research
16
ctrl + w # 删除 cmd 的最后一个单词 word
17
ctrl + u # 从头删除 cmd 到光标处(不包括光标)
18
ctrl + k # 删除从光标处(包括光标)到 cmd 的末尾
19
ctrl + l # 清屏
20
21
# 快速取消 bash 终端中的输入,另起一行的做法
22
ctrl + a, 输入 #,如果后期还想用到这个命令,可以直接在 history 中查找
23
24
# 在终端中键入空格,应该加反斜杠进行转义
25
\
Copied!

history

1
# bash 运行中的 history 记录是记录在内存中的,只有在推出 bash 时,才会将新的记录写入 $HOME/.bash_history
2
history # 查看运行过的命令
3
!num # 运行 history 中的编号为 num 的命令
4
history 100 # 列出最近的100条
5
!! # 执行上一条命令
Copied!

文本和字符串处理相关命令

通配符

1
常用通配符
2
?: 一个字符
3
*: 零个或多个字符
4
[a-z]: 匹配 a-z
5
[abc]: 匹配 abc
6
7
Demos:
8
ls -l /bin/c* # 列出系统中以 c 开头的命令
9
rm /home/work/odp/log/* # 删除 log 目录下所有文件
10
ls -lF lin[a-z]x # 查看所有 lin[]x 文件的详情
Copied!

cat / tac

1
cat -n file # 打印出行号 -n number
2
cat -b file # 只给有文本的行加上行号, -b: --number-nonblank
3
4
tac # 从后往前看日志
5
tac log.txt | more
Copied!

echo

1
man echo # echo 手册
2
# echo 换行
3
echo -e [global]\\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple > pip.conf # -e 表示对反斜线进行转义, \\ 表示反斜线,\\n 就等价于 \n 换行,结果就是:
4
# [global]
5
# index-url = https://pypi.tuna.tsinghua.edu.cn/simple
Copied!

more

1
# 分页显示文件内容,显示内容百分比
2
# 敲回车查看下边的内容,不支持回看
3
# 敲空格可以翻页
4
5
# 停止:q
6
# 搜索(向下搜索):/要搜索的内容
Copied!

less

1
# 分页显示文件内容
2
3
# 向下搜索:/要搜索的内容
4
# 向上搜索:?要搜索的内容
5
# n 重复前一个搜索
6
# less 支持回看,支持上下键翻看
7
8
# 停止:q
Copied!
1
# -n number
2
# 查看文件前n行内容,默认显示头 10 行
3
head -n 20 file # 200 显示头 200 行, 可以简写成 head -20 file
Copied!

tail

1
# 实现 log 文件的实时监控
2
tail -f file # -f: follow
3
4
# 查看后 20 行的内容
5
tail -n 20 file # 可以简写成 tail -20 file
Copied!

wc 计算文件行数

1
参数:
2
-c: 打印字节的个数
3
-m: 打印字符的个数
4
-l:打印行数
5
-w: 打印单词的个数
6
7
wc file # 行数 + 单词数 + 字节数
8
wc -l file # 行数
Copied!

sort

1
参数
2
-n --numeric-sort
3
-f --ignore-case
4
-c check if it has been sorted
5
-u unique # 去除重复行
6
-r reverse
7
-b --ignore-leading-blanks # 会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
8
-k # --key=KEYDEF KEYDEF gives location and type 指定按照第几列进行排序,从 1 开始数,
9
-t # --field-separator=SEP # 分隔符
10
11
Demo:
12
sort -u data.txt > test.txt # 去除重复行
13
sort -r number.txt > num.txt # 降序排列(默认升序)
14
sort -n number.txt 按照数值进行排序(而不是字符串)
15
16
# 按照指定列进行排序,用 -k 来指定列数 第4列,-t ',' 设置间隔符为逗号
17
sort -k 4 -t ',' 微博数据_valid.csv > sorted.csv
Copied!

grep

1
全称:
2
global search regular expression(RE) and print out the line
3
4
参数:
5
-i, --ignore-case ignore case distinctions
6
-o, --only-matching show only the part of a line matching PATTERN
7
-v, --invert-match select non-matching lines 反向匹配
8
9
10
11
Demos:
12
grep match_pattern file # 输出 file 中匹配到 pattern 的行
13
14
# grep 命令从后往前查找
15
tac log.txt | grep "regx"
16
17
# 反向匹配,不匹配包含 match_pattern 的数据,把 grep 这个进程过滤掉
18
ps -fe | grep java | grep -v grep
Copied!

awk 命令

awk 是一个强大的文本处理工具,通常用于生成格式化的日志文件,其本质上更像是一个管道中的文本处理器。
awk 会自动给一行中的每个数据元素分配一个变量,默认情况下,awk 会将如下变量分配给其在文本行中发现的字段:
1
$0 代表整个文本行
2
$1 代表文本行中的第一个数据字段
3
$2 代表文本行中的第二个数据字段
4
$n 代表文本行中的第n个数据字段
Copied!
awk 中内置很多函数,例如算数函数: int(),字符串函数: substr(), length()等,具体参考: awk内置函数
语法
1
echo "Hello linux" | awk '{awk_cmd}' # 必须是 单引号 + 大括号
Copied!
常见命令选项
选项
描述
-F
指定划分数据字段的分隔符
-f file
c从指定文件中读取 awk 脚本程序
Demo
1
# 不管输入什么,输出都是 nihao, linux
2
echo "hello" | awk '{print "nihao, linux"}'
3
4
# 从文件输入文本进行处理,输出每行的第一个字符串
5
awk '{print $1}' data.txt
6
7
# 指定分隔符为 :
8
awk -F: '{print $1}' data.txt
9
10
# 执行多个命令: 将名称替换成 dongxin,然后打印全行
11
echo "hello my name is wansho" | awk '{$5="dongxin"; print $0}'
12
13
# 获取缓存的大小
14
buff_cache=`free -h | grep Mem: | awk '{print int(substr($6,0,length($6)))}'`
15
16
# 将 awk 命令存储到文件中
17
cat script.awk
18
{print $1 "'s home directory is " $6}
19
awk -F: -f script.awk /etc/passwd
Copied!

sed 命令

1
# 常见的 sed 替换字符串的语法,全局替换某个字符串
2
sed -i 's/Search_String/Replacement_String/g' Input_File
Copied!

diff 命令

用于比较同一文件,两个版本的区别。

输入输出重定向

> < >> <<

Linux 有三个标准文件描述符:
描述符
描述
作用
0
stdin
标准输入,默认是键盘
1
stdout
标准输出,默认是屏幕
2
stderr
标准错误,默认是屏幕
数据流重定向符:
符号
作用
Demo
>
对输出进行重定向,也就是不输出到屏幕,改输出目的地
ls -al test1 1> file #将标准输出重定向号file
<
对输入进行重定向,也就是不再从键盘输入,改从其他源输入
Demos
1
# 将 standard output 写入到 file 中
2
echo content > filename # 将输出覆盖到 filename 中,等价于 echo content 1> filename
3
echo 内容 >> filename # 给文件追加内容
4
5
# 将 standard error 写入到文件中
6
cmd 2> file #
7
8
# 将日志分开存储
9
ls -al test test2 test3 2> err.log 1> info.log
10
ls -al test test2 test3 2>> err.log 1>> info.log # 日志追加
11
12
# 所有输出都重定向到一个文件
13
ls -al test test2 test3 &> info.log
14
15
# 重定向到 null device,null device 是 Linux 系统的垃圾桶,可以把任何垃圾丢到这里,并且返回一个操作成功的返回码
16
echo "demo" > /dev/null
17
# https://en.wikipedia.org/wiki/Null_device
Copied!

tee cmd

tee 命令相当于管道的一个 T 型接头,它可以将输出发往两处:一个是 stdout,一个是指定的文件名。
相当于我之前在 django 中定义的既可以将 log 写入文件,又可以将 log 打印到控制台的功能。
Demo:
1
date | tee log.log
2
date | tee -a log.log # -a:--append 追加
3
python demo.py | tee -a log.log
Copied!

创建临时文件和目录 mktemp

1
# /tmp 文件夹,大多数 Linux 发行版会默认在系统启动时删除 /tmp 目录的所有文件
2
mktemp log.XXXXXX # 在本地目录下创建一个临时文件,log 为文件名,mktemp 会用六个随机字符替换后面的六个X,该命令返回创建的临时文件的 name
3
mktemp -t log.XXXXXX # 强制在系统的临时目录(/tmp)来创建该文件,并返回该临时文件的全路径
4
mktemp -d tempdir.XXXXXX # 创建临时目录
Copied!

文件与设备管理

tree

1
生成目录树
2
tree -I dir # 忽略某一个文件夹
Copied!

cd

1
cd # 切换到 home 目录,等价于 cd ~
2
cd . # 当前的文件夹
3
cd - # 回到刚才的文件夹 重点!!!
4
cd ~ # 回到当前用户的主文件夹
5
cd ~user # 到某个用户的家目录
6
cd .. # 转到上一级文件夹
Copied!

ls

1
ls -h # human 人类易读的方式,文件大小会转成人易读的方式,加上单位
2
ls -t # 将文件按照最新修改的时间进行排序
3
4
ls -l # long 详细信息
5
文件详细信息展示后,按照信息开头的字母,可以分成如下文件:
6
1. d 目录
7
2. - 文件
8
3. l 连接文件
9
4. c 设备文件中的串行端口设备,例如键盘、鼠标
10
11
ls -a # all, 包含隐藏的文件
12
ls -F # --classify,使输出文件的文件类型可分辨。(文件夹带上/, 可执行文件加上*)
13
ls -i # 显示文件的 id (inode 编号,第一个属性)
14
ls --group-directories-first # 优先显示文件夹
Copied!

mv

1
-i: --interactive
2
3
mv oldname newname # 更改文件名字
4
mv olddir/ newdir # 更改文件夹名称
5
6
mv file directory # 将文件移动到 directory 中
7
mv file_oldname dir/file_newname # 将文件移动到 dir 中并改名字
8
mv -i oldname newname # 加 -i 会在 newname 文件已经存在的情况下得到提示
9
mv dir new_path # 不加参数的移动整个文件夹
10
11
# Note:
12
# 移动过后的文件夹,其文件的属性不会有任何改变,时间戳和 inode 编号也不会有改变。
Copied!

cp

1
cp 源文件 复制文件
2
cp -R/-r 目录 目标目录 # 递归复制"目录"需要添加参数-R
3
cp *.sh dir # 复制所有的 sh 文件到某个文件夹
Copied!

file

1
file 文件 # 查看文件是什么文件
Copied!

mkdir

1
mkdir -p /home/work/odp/app/bq # no error if existing, make parent directories as needed
2
# 创建文件夹后并进入该文件夹
3
cd $_ # $_ 记录了上一个命令最后一个参数
Copied!

tar / zip

1
# 打包压缩
2
tar -czvf haha.tar.gz file1 file2
3
4
# 拆包解压缩
5
tar -xzvf haha.tar.gz
6
tar -xzvf haha.tar.gz -C path # 解压到指定文件夹
7
# tar 命令解压的文件,会覆盖原文件
8
9
# zip
10
zip
11
unzip
Copied!

查找命令 which, find, locate, whereis

which 在 path 变量中查找命令
1
# which 用来在所有的 PATH 路径中查找 某个命令 所在地址,例如查找 ls, cat 命令所在地址,注意每一个用户的 PATH 命令可能是不一样的,不同用户使用 which 查找某个命令的结果可能有所区别,有的用户可能找不到某个命令的地址
2
which cat
3
which ls
4
which -a ls # 查找所有的 ls 命令所在地址,可能 ls 不止一个
Copied!
find
1
find -name ./ 文件名 # 在当前目录下查找某个文件
2
3
find -type f ./ # 查找当前文件夹下的 一般文件
4
5
# 注意 \; 用来告诉 find 命令查询已结束,The \; part is basically telling find "okay, I'm done with the command I wanted to execute".
6
# 注意: -exec 并不是管道命令,其是 find 自带的参数,xargs 是管道命令,应该和管道一起使用
7
find ./ -type f -name "*.txt" -exec cp {} /test \;
8
find ./ -type f -name "*.txt" -exec ls -l {} \; # 查看当前文件夹下的 txt 文件的详细信息
9
find ./ -type f -name "*.txt" -print | xargs ls -l # 不需要加 \; 因为是管道命令
Copied!
whereis 和 locate
1
whereislocate 是使用数据库来搜寻数据,类似于 everything。但是 whereislocate 命令有一个缺点,对于新生成的文件和已删除的文件,不能及时的更新和维护数据库,所以可能导致新的文件查不到。
2
实际情况下,locate 的效果要优于 whereis
3
4
# locate 依据 /var/lib/mlocate 内癿数据库记载,找出用户输入癿关键词文件名
5
locate -i passwd # 查找包含文件名包含 passwd 字符串的文件,忽略大小写
6
7
# 及时更新文件数据库的命令。根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名
8
updatedb # 更新db,比较耗时
Copied!

ln

1
# make links between files. 默认创建 硬链接
2
3
# 参数:
4
# -s: --symbolic, make symbolic links instead of hard links
5
6
# Demos:
7
# 创建硬链接,本质上是同一个文件,共享 inode 编号,而且文件显示并非链接文件,而实正常的文件,如果把源文件删除,硬链接仍然有效!注意,硬链接可执行文件复制到 PATH 变量包含的目录后,可以直接通过命令运行。
8
ln file link_file
9
ln file dir/
10
# 创建符号 (symbolic) 软件链接,生成一个链接类型的文件,文件大小很小,文件类型为 l
11
ln -s file file_link
Copied!

文件权限

用户增删改查

增加用户, useradd
1
参数:
2
-u --uid UID user ID of the new account
3
-p --password PASSWORD encrypted password of the new account
4
-D --defaults print or change default useradd configuration
5
-m --create-home create the user's home directory
6
-c --comment COMMENT GECOS field of the new account
7
-g --gid GROUP name or ID of the primary group of the new account
8
-s --shell login shell of the new account
9
10
Demos:
11
useradd -m -c "for work" -u 8888 -p ws6226067 -s /bin/bash work
12
13
# 注意:
14
# 1. 默认情况下,useradd 不会创建用户目录
15
# 2. useradd 在创建用户主目录后,会将 /etc/skel/ 下的文件复制到用户目录下,这些文件时 shell 下的标准启动文件,用于用户级别的初始化
Copied!
删除用户,userdel
1
# 删除用户,当并没有删除属于该账户的任何文件
2
userdel wansho
3
4
# 删除用户,并删除该用户相关的文件
5
userdel -r wansho # -r --remove
Copied!
修改用户,usermod, passwd
1
usermod 参数
2
-c, --comment COMMENT new value of the GECOS field
3
-G, --groups GROUPS new list of supplementary GROUPS
4
-a, --append append the user to the supplemental GROUPS, mentioned by the -G option without removing him/her from other groups
5
-l, --login NEW_LOGIN new value of the login name
6
-L, --lock lock the user account
7
-U, --unlock unlock the user account
8
-p, --password PASSWORD use encrypted password for the new password
9
10
passwd 参数
11
-a, --all report password status on all accounts
12
-d, --delete delete the password for the named account
13
14
Demos:
15
usermod -c "wansho test" wansho # 修改用户说明
16
usermod -G work wansho # 将用户 wansho 加入 work 用户组 (wansho 只属于 work 组)
17
usermod -a -G work wansho # 把用户 wansho 添加到 work 组,之前所属组不影响
18
usermod -p xxxxxx wansho # 修改 wansho 的密码为 xxxxxx
19
20
passwd wansho # 修改 wansho 用户的密码
21
22
# 注意:
23
# 1. 对组关系进行更改后,需要登出系统再登陆,组关系变更才会生效
24
# 2. 当一个用户在 /etc/passwd 中制定了某个组作为默认组后,该用户账户就不会作为该组成员在 /etc/group
Copied!
查看所有用户 whoami, /etc/passwd, /etc/shadow
1
# 存储用户信息的文件: /etc/passwd
2
# 注意,该文件中有很多账户,但是大多数都是系统账户,Linux 系统会为各种各样的功能创建不同的用户账户,这些账户并不是真正的用户
3
# Linux 为系统账户预留了 500 以下的 UID
4
# /etc/passwd 中每行记录的具体内容,例如:
5
work:x:1001:1001::/home/work:/bin/bash
6
账户名:密码:UID:GroupID:备注:用户家目录:用户默认的shell类型
7
8
# /etc/passwd 中存储着每个用户的加密后的密码
9
10
# whoami 命令可以查看目前登陆的用户是谁
Copied!

用户组增删该查

增加用户组 groupadd
1
Demos:
2
groupadd test_group # 新建一个用户组
3
usermod -G test_group wansho # 将 wansho 加入该用户组
Copied!
删除用户组 groupdel
1
Demo:
2
groupdel group_name # 删除一个用户组
Copied!
修改用户组 groupmod
1
参数:
2
-n, --new-name NEW_GROUP change the name to NEW_GROUP
3
4
Demo:
5
groupmod -n test_group new_group
6
7
# 注意,更改了用户组的组名后,不会影响该用户组里的用户,因为是对于用户组的引用都是基于编号的
Copied!
查看所有用户组 /etc/group
1
Demo:
2
cat /etc/group # 查看所有用户组
Copied!
###文件权限管理
修改读写和执行的权限 chmod
1
r 用4表示
2
w 用2表示
3
x 用1表示
4
5
u user
6
g group
7
o other
8
a all
9
10
-R 选项: 递归修改文件内的权限
11
12
Demos
13
chmod 755 file
14
7 111 表示所有者的权限是 可读可写可运行
15
5 101 表示所有组的权限是 可读不可写可执行
16
1 001 表示其他人的权限是 可执行
17
18
chmod 755 -R dir # 递归修改 dir 的权限
19
20
chomod -R g+rwx dir # 递归地对 dir 加上对于用户组的 rwx 权限
Copied!
修改文件所属用户 chown
1
chown owner file # 修改 file 的 所有者 为 owner
2
chown owner -R dir # 递归修改
Copied!
修改文件所属用户组 chgrp
1
chgrp grp file # 修改 file 的组为 grp
2
chgrp grp -R dir # 递归修改
Copied!
实现文件的组内共享
1
需求:配置 wansho 的某个文件夹在 work 用户组中共享
2
实现:
3
1. 配置该文件对于用户组的权限:可读可写可执行 chmod g+r
4
2. 配置该文件所属用户(wansho)属于用户组(work):usermod -a -G group work
Copied!

进程/磁盘/资源管理

进程层次图

进程层次图

top

1
top
2
显示当前系统中耗费资源最多的进程
3
查看各个进程的资源占用情况,提供当前进程的快照,即时查看最活跃的进程。
4
5
top 命令的 %CPU 显示的实际上是该进程占用的单个 CPU 的大小
6
而 CPU(s) 显示的才是 总的 CPU 的占比。按 1 键可以切换 CPU,查看其他 CPU 的情况。
Copied!
Top 命令详解

ps

process snapshot.
1
# 参数
2
-a 不与 terminal 相关的所有进程
3
-u 有效用户
4
-x 与 a 使用,可列出完整信息
5
6
-f --full-format listing,类似于 -l
7
-e 选择所有的进程
8
--forest 显示进程树,列出父子进程的关系
9
10
# demo
11
ps -fe # 等价于 ps aux
12
ps -ef | grep vim
13
14
ps -l # 查看自己 bash 相关的进程
15
ps -e # 查看所有的进程, 如果不加 e,那么只会列出该 bash 下的进程
16
17
18
查看所有进程的所有信息,通常与 grep 命令组合使用。查不出来进程所占用的资源量。
Copied!

kill

1
kill -9 PID # 无条件杀死某个进程
2
kill -HUP pid # 重新加载配置文件
3
ps -fe | grep Aug.*python | grep -v grep | awk '{print $2}' | xargs kill -9 # 批量杀死包含某个关键字的进程
4
5
killall http* # 结束所有以 http 开头的进程
Copied!

free

1
命令参数
2
-b  以Byte为单位显示内存使用情况。
3
-k  以KB为单位显示内存使用情况。
4
-m  以MB为单位显示内存使用情况。
5
-g 以GB为单位显示内存使用情况。
6
-o  不显示缓冲区调节列。
7
-s<间隔秒数>  持续观察内存使用状况。
8
-t  显示内存总和列。
9
-V  显示版本信息。**
10
11
Demos:
12
free -h # 结果中的 Mem 行就是内存的使用情况
Copied!

df

1
disk free
2
3
df -h path # 查看某个文件夹所挂在的磁盘的使用情况
4
df -h # 查看所有挂在的磁盘的使用情况
Copied!

du (disk usage)

1
# disk usage 列出指定的文件占用的磁盘空间
2
3
du -hs file|path|* # 列出文件占用磁盘的空间
4
du -h --max-depth=1 # 查看当前一级目录下的文件或者文件夹占用磁盘的大小
Copied!

pgrep, pkill

1
# find or signal process by name
2
3
pgrep -l mysql # 返回 MySQL 的 pid
4
pkill -x mysql #
Copied!

systemctl

system-control
1
systemctl stop firewalld # 关闭防火墙
Copied!

ulimit

Linux ulimit 命令用于控制进程的资源。
  • -a  显示目前资源限制的设定。
  • -c <core文件上限>  设定core文件的最大值,单位为区块。
  • -d <数据节区大小>  程序数据节区的最大值,单位为KB。
  • -f <文件大小>  shell所能建立的最大文件,单位为区块。
  • -H  设定资源的硬性限制,也就是管理员所设下的限制。
  • -m <内存大小>  指定可使用内存的上限,单位为KB。
  • -n <文件数目>  指定同一时间最多可开启的文件数。
  • -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
  • -s <堆叠大小>  指定堆叠的上限,单位为KB。
  • -S  设定资源的弹性限制。
  • -t <CPU时间>  指定CPU使用时间的上限,单位为秒。
  • -u <程序数目>  用户最多可开启的程序数目。
  • -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。
1
# 查看当前 shell 配置的
2
ulimit -a
3
4
# ulimit -n will only display the soft limit.
5
ulimit -n
Copied!
配置进程资源 /ect/security/limits.conf/etc/security/limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件。有 soft,hard和 -,soft 指的是当前系统生效的设置值,软限制也可以理解为警告值。 hard 表名系统中所能设定的最大值。soft 的限制不能比 hard 限制高,用 - 表明同时设置了 soft 和 hard 的值。https://www.cnblogs.com/operationhome/p/11966041.html
1
# 修改 LINUX 系统对用户的内存大小和文件句柄限制限制
2
echo "ems soft nofile 65536" >> /etc/security/limits.conf
3
echo "ems hard nofile 65536" >> /etc/security/limits.conf
4
echo "ems hard memlock unlimited" >> /etc/security/limits.conf
5
echo "ems soft memlock unlimited" >> /etc/security/limits.conf
6
# max size virtual memory [] for user [] is too low, increase to [unlimited]
7
# https://www.elastic.co/guide/en/elasticsearch/reference/master/max-size-virtual-memory-check.html
8
echo "ems - as unlimited" >> /etc/security/limits.conf
9
echo "root - as unlimited" >> /etc/security/limits.conf
10
echo "ems - fsize unlimited" >> /etc/security/limits.conf
Copied!
https://superuser.com/questions/740000/modify-and-apply-limits-conf-without-reboot
修改完 limits.conf 配置后,重新 ssh 登录用户即可生效。
注意!wildcard * won't apply for root user. 通配符并不适用于 root 用户,如果需要配置 root 用户,则需要明文配置!
These limits will be applied after reboot.
If you want to apply changes without reboot, modify /etc/pam.d/common-session by adding this line at the end of file:
1
session required pam_limits.so
Copied!
查看一个进程的资源限制:
1
cat /proc/<pid>/limits
2
3
# 获取当前 shell 的进程号
4
ps | grep $
Copied!

limit

动态修改当前用户的资源配置。
1
# 修改虚拟内存
2
limit vmemoryuse unlimited
3
4
# 显示所有的可改选项
5
limit
6
7
cputime unlimited
8
filesize unlimited
9
datasize unlimited
10
stacksize 8192 kbytes
11
coredumpsize 521000 kbytes
12
memoryuse unlimited
13
vmemoryuse unlimited
14
descriptors 1024
15
memorylocked unlimited
16
maxproc 65535
17
maxlocks unlimited
18
maxsignal 513621
19
maxmessage 819200
20
maxnice 0
21
maxrtprio 0
22
maxrttime unlimited
Copied!

网络相关

ifconfig

1
ifconfig # 查看网卡信息,注意是查看已经配置好的网卡信息
2
3
ifconfig -a # 查看所有的网卡信息,没有配置的也是
Copied!

netstat

介绍
netstat 用于显示网络相关信息,可以用于查看端口被那个进程占用了
1
netstat -tunpl | grep 端口号
Copied!

1024以下的端口

1
# Linux 系统的 1024 以下的端口只有 root 用户才能占用。
Copied!

lsof

lsof - list open files
1
lsof -i:port # 查看指定端口被哪个进程占用,功能类似于 netstat -tunpl | grep 端口号
Copied!

wget, curl

1
curl 域名 # 在终端中打印 HTML 源码,注意这里只是域名,不是完整的URL链接
2
curl -O http://man.linuxde.net/text.iso # O 大写,下载文件
3
curl -o tmp.iso http://man.linuxde.net/text.iso # 下载文件并重命名
4
wget http://man.linuxde.net/text.iso # 不加任何参数,直接下载文件
5
wget -O /home/work/temp/tmp.iso http://man.linuxde.net/text.iso # 下载文件到指定文件夹下并重命名
6
wget http://man.linuxde.net/text.iso -P /home/work/test # 下载文件到指定文件夹
7
注意 wget 命令的 -O 参数功能包含了 -P 参数,所以两个参数不需要重复出现,demo:
8
wget -O /home/work/test/measure_site/measure_site/data/tmp/deploy_value_diff/baidu_ps-se-fe-tpl_aladdin-atom-1.0.362.1-53707.tar.gz ftp://getprod:[email protected]/data/prod-aos/prod-64/baidu/ps-se-fe-tpl/aladdin-atom/aladdin-atom_1-0-362-1_PD_BL/aladdin-atom_1.0.362.1.tar.gz
9
10
下载文件夹,即递归下载一个文件夹
11
wget -r url
12
13
重点:
14
wget url
15
curl -o rename url
Copied!
wget 和 curl 的区别:
  • wget is a tool to download files from servers。wget 用来从服务器下载文件
  • curl is a tool that let's you exchange requests/responses with a server。curl 用来和服务器进行交互,其更像是一个类似浏览器的客户端。curl 支持多种应用层协议。

ssh

ssh(secured shell) 用来远程登录访问。
ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine. It is intended to provide secure en‐crypted communications between two untrusted hosts over an insecure network. X11 connections, arbitrary TCP ports and UNIX-domain sockets can also be forwarded over the secure channel.
ssh connects and logs into the specified destination, which may be specified as either [[email protected]]hostname or a URI of the form ssh://[[email protected]]hostname[:port]. The user must prove his/her identity to the remote machine using one of several methods (see below).
命令格式:ssh [-p port] [email protected],Demo:ssh -p 22 [email protected]

route

多网络间路由配置(配置静态路由)
route:
Demo:
1
Linux1:
2
10.0.0.128
3
4
Linux2:
5
10.0.0.129
6
192.168.1.129
7
8
Linux3:
9
192.168.1.130
10
192.168.2.130
11
12
其中 Linux2 作为路由器
13
14
添加静态路由常用参数:
15
16
add 增加路由
17
del 删除路由
18
-net 设置到某个网段的路由
19
-host 设置到某台主机的路由
20
gw 出口网关 IP地址
21
dev 出口网关 物理设备名
22
23
设置到某个网段的路由:
24
route add -net 目标网段 gw 网关(路由器)
25
例如:
26
从 1 到 3,经过路由 2:route add –net 192.168.1.0/24 gw 10.0.0.129
27
从 3 到 1,经过路由 2:route add -net 10.0.0.0/24 gw 10.0.0.129
Copied!
注意,直接在 shell 中通过 route 增加静态路由,是临时的,系统重启后,则失效,如果想开启生效的话,需要在开机脚本中进行配置。

telnet

一个与其他主机进行通信的工具集。
The telnet command is used for interactive communication with another host using the TELNET protocol. It begins in command mode, where it prints a telnet prompt ("telnet> "). If telnet is invoked with a host argument, it performs an open command implicitly; see the description below.
测试远程主机的端口是否打开
1
telnet ip port
2
# 退出 telnet:ctrl + ],然后 quit
Copied!

防火墙

开放防火墙上的一个端口
1
firewall-cmd --zone=public --add-port=3306/tcp --permanent
2
firewall-cmd --reload
Copied!
关闭防火墙
1
systemctl stop firewalld # 关闭防火墙 system-control
Copied!
能 ping 通,但是访问不了,netstat 看一下端口,可能是防火墙的问题

硬件相关

ethtool

需要 root 权限
1
ethtool -p 网口名字 秒数 # 让某个网口亮多少秒,服务器上的网口是可以亮的,因为服务器上通常有很多网口,不好分辨
Copied!

crontab

crontab 命令用于定义循环执行的工作。
注意,crontab 一定是准时准点运行的。
crontab 命令 由 系统的 cron 系统服务控制。linux 系统上有很多例行性工作,所以 cront 系统服务是默认启动的。 crontab 如果设置每隔 半小时 执行一次,它会在 crontab 设置成功的那一刻开始计时,而不是在标准的 10.00 10.30 执行。
配置可以使用 crontab 命令的账户:/etc/cron.allow 配置不可以使用 crontab 命令的账户:/etc/cron.deny 默认情况下,只要用户不被列入 /etc/cron.deny,就可以执行 crontab 命令。
Summary ​ 1. crontab 最小的执行单位是 分钟,所以是 年月日时分 五个时间参数。 ​ 2. * * * * * 分别代表 分 时 日 月 年 ​ 3. crontab 用于定时执行一些重复的工作,例如每天定时发一封邮件,定时备份,每天定时提醒自己做什么事,都可以在 linux 中执行 ​ 4. crontab 类似 linux 下的 shell 脚本,其中的注释 为 #
crontab 命令的参数
1
-l 查阅所有的 crontab 任务
2
-e 进入 vim 编辑crontab命令
3
-r 删除所有的 crontab 命令
Copied!
crontab 时间参数
1
* * * * * 分别代表 分 时 日 月 年
2
* 代表任意时刻都可以
3
, 表示或者的关系,例如 0 3,5 * * * command 表示 凌晨 3 点 和 5 点 执行命令
4
- 表示一段时间,例如 0-10 * * * * command 表示每小时的 010 分执行 command 命令
5
/n n 代表数字,即每隔 n 时间间隔执行一次,例如 */5 * * * * command 用 * 与 /5 进行搭配,表示每隔 5 分钟执行一次,也可以写成 0-59/5 * * * * * command,意思相同
6
/n n 代表数字,即每隔 n 时间间隔执行一次,例如 * */1 * * * command 用 * 与 /5 进行搭配,表示每隔 一小时 执行一次
Copied!
Demo
1
* * * * * date >> /home/work/tmp # 每过一分钟,将日期存储到 tmp 文件中
2
* * * * * python /home/work/test/crontab_test/crontab_test.py >> /home/work/test/crontab_test/log.txt # 将标准输出 1 打印的日志存储到 log.txt 中
3
* * * * * python /home/work/test/crontab_test/crontab_test.py >> /home/work/test/crontab_test/log.txt 2>&1 # 将标准错误输出 2 写入到 log 文件中,并且借助了 1 的管道,注意此处的 2>&1 不能改成 2>>&1
4
* * * * * python /home/work/test/crontab_test/crontab_test.py >> /home/work/test/crontab_test/log.txt 2>> /home/work/test/crontab_test/err_log.txt # 将正确输出信息写入 log 文件,将错误输出信息写入 error_log 文件
5
0 12 * * * command # 每年每月每天的中午 12:00 执行 command
6
* * * * * mail dmtsai -s "at"
Copied!
注意,我们在使用 crontab 运行 Linux shell script 时,一定要指定脚本的 shell,并且尽量使用绝对路径,否则容易因为环境的原因,出现各种乱七八糟的问题:
1
*/5 * * * * /bin/bash /home/work/wansho_webservice/wansho_webservice/shell_scripts/buff-cache-monitor.sh >> /home/work/wansho_webservice/log/buff-cache-monitor.log 2>> /home/work/wansho_webservice/log/buff-cache-monitor.log
2
# 其中 /bin/bash 制定了运行的 shell
Copied!

rz, sz

安装 rz sz 命令
1
sudo apt-get install lrzsz
Copied!
rz
1
rz 将本地文件上传到 linux 当天文件夹
2
参数如下:
3
4
-b 以二进制方式,默认为文本方式。(Binary (tell it like it is) file transfer override.)
5
-e 对所有控制字符转义。(Force sender to escape all control characters; normally XON, XOFF, DLE, [email protected], and Ctrl-X are escaped.)
6
7
如果要保证上传的文件内容在服务器端保存之后与原始文件一致,最好同时设置这两个标志,如下所示方式使用:
8
rz -be
Copied!
sz
1
sz 从线上机器拉取文件到本地
2
参数如下:
3
4
-a 以文本方式传输(ascii)。
5
-b 以二进制方式传输(binary)。
6
-e 对控制字符转义(escape),这可以保证文件传输正确。
7
8
如果能够确定所传输的文件是文本格式的,使用 sz -a files
9
如果是二进制文件,使用 sz -be files
10
11
sz 好像默认不能下载文件夹,先在 服务端把文件夹打包,然后下载比较好
Copied!

reboot, halt, shutdown

1
shutdown -r +5 # 5分钟后关机
2
3
reboot # 重启
4
5
halt # 关机
Copied!

init

1
进入完全命令模式 init 3
2
进入图形化界面 init 5
3
重启 init 6
4
5
0 停机(千万不能把initdefault 设置为0)
6
1 单用户模式
7
2 多用户,没有 NFS(和级别3相似,会停止部分服务)
8
3 完全多用户模式,进入命令行界面
9
4 没有用到
10
5 x11(Xwindow) 进入图形化界面
11
6 重新启动(千万不要把initdefault 设置为6)
Copied!

sudo

1
既然切换到 root 用户需要 root 密码,那么 root 用户的密码难免被各个用户知道,为了防止 root 密码外漏,给出了 sudo 方法。并不是所有的用户都可以执行 sudo 命令,必须经过 root 用户的配置。配置完后,被配置的用户就可以使用 sudo 命令短暂的用 root 的身份执行命令,而且 sudo 后输入的密码是 用户自己的密码,这样就防止了 root 用户密码的泄漏。
2
3
在 root 下配置 sudo 命令的教程:
4
visudo
5
在文件最后一样加入:
6
work ALL=(ALL) ALL # 其中 work 是赋予 sudo 权限的普通用户,后面模式固定
7
work ALL=(ALL:ALL) NOPASSWD:ALL # 该命令是赋予 work 用户 root 的权利,不需要密码
Copied!

su 命令

1
switch user
2
3
su - root # 等价于 su -
4
su - user # 切换到某个用户的家目录
5
su root 也可以切换到root用户,但是没有管理员权限
Copied!

Shell 详解 和 环境变量

基础知识

1
1. shell 是 Linux 系统上的一个软件,是 Linux 系统和用户进行交互的接口。
2
2. Bash 是 shell 的一种,是一个可执行文件 /bin/bash, (ls -alF /bin/bash)
3
3. 有的系统,其系统内核的 shell 和默认的交互式 shell 是不一样的,例如 ubuntu 的的默认系统 shell 为 /bin/dash
Copied!
zsh
目前 geek 使用最多的 shell,是 Z Shell(zsh),zsh 已经成为了 Mac OS 的默认 shell,[install] [change shell]
1
# 查看当前 shell
2
echo $SHELL
3
4
# 查看系统支持的 shell
5
echo /etc/shells
Copied!

父 shell 和 子 shell、后台模式、jobs、coproc

概念
1
# 父shell 和 子shell 的关系,是父进程和子进程的关系,子shell 并不是真正的多进程处理,因为终端控制着 子shell 的 IO
2
3
# 开启一个 子shell,也就是一个子bash,这个子shell,也是一个子进程
4
bash # 由于 /bin/ 在 PATH 环境变量中进行了配置,所以可以直接输入 bash,等价于 /bin/bash
5
6
# 注意,生成 子shell 后,只有在 父shell 中 export 的变量,才会被复制到 子shell 环境中,而且 子shell 对于 父shell 的变量只有 可读 的权力
Copied!
命令列表
1
# 作用:在 本shell 中批量执行命令
2
pwd; ls; date; sleep 10
Copied!
进程列表 (cmd1;cmd2;cmd3)
1
# 进程列表是用括号包围起来的一组命令,其能够创建 子shell(子bash)来执行这些命令,注意,进程列表执行仍然会阻塞 父shell
2
3
# 进程列表的功能:
4
# 1. 在 子shell 中批量执行命令
5
6
# 在 子shell(子bash) 中执行命令列表
7
(date;pwd;ls) # 括号的加入使得命令列表变成了进程列表,并生成了一个 子shell 来执行对应的命令
8
9
# 查看当前 bash 的进程数
10
ps --forest
Copied!
后台模式 & 、jobs 命令、coproc
1
# 进程列表的运行仍然会阻塞父shell,在后台模式中运行命令可以在处理命令的同时,让出 CLI(Command Line Interface),以供他用。开启后台模式运行的命令,其就是一个后台作业,可以用 jobs 命令查看后台作业的详情
2
# 后台模式的进程就是一个 daemon,守护进程
3
4
# 开启后台模式
5
cmd& # 可以理解成,从前台进程转为后台守护进程
6
# 运行结果:[num] pid,其中 num 为 jobs 号,pid 后台作业的 进程id。
7
8
# 查看当前运行在后台模式中的所有作业
9
jobs
10
jobs -l # 查看所有后台作业的详情
11
12
# 杀死 jobs
13
kill -9 pid
14
15
# 将进程列表置于后台运行
16
(cmd1;cmd2;cmd3)& # 这么做的好处是,在 子shell 中进行繁重的处理工作,同时不会让 子shell 的 IO 受制于终端
17
18
# coproc (cop process)在后台模式执行 cmd。等价于(后台模式)
19
# https://www.gnu.org/software/bash/manual/html_node/Coprocesses.html
20
coproc cmd # 在后台模式中执行 cmd
21
coproc (cmd1;cmd2) # 创建一个 子shell,并在 子shell 中执行命令列表
22
type coproc # coproc is a shell keyword
Copied!
后台模式和进程列表的关系
进程列表会进入一个子bash,并在该bash中运行命令
1
(sleep 100; echo "hehe")
2
bash
3
\_ bash
4
\_ sleep
Copied!
后台模式是创建了一个job,这个job是父bash直接创建的子进程,并且在后台运行,不会影响到父bash
1
sleep 100&
2
bash
3
\_ sleep
Copied!

type, 外部命令和内建命令

1
# shell 中执行的命令分为 外部命令 和 内部命令,外部命令通常位于 /bin, /usr/bin/,/sbin/,/usr/sbin 中
2
# 注意:当外部命令执行时,会创建一个 子进程(不是子shell),这种操作叫做 forking(衍生)
3
# Demo: ps 是一个外部命令,所以其在 bash 中运行时,会被 bash 创建一个 子进程,其父进程就是 bash
4
ps -f
5
UID PID PPID C STIME TTY TIME CMD
6
work 31967 31966 0 09:43 pts/0 00:00:00 -bash
7
work 32418 31967 0 10:08 pts/0 00:00:00 ps -f
8
9
# 外部命令和内部命令的区别
10
内部命令是 bash 中集成的命令,与 bash 编译成一体,不需要 new 一个 子进程 来运行
11
12
# 如何判断一个命令是外部命令还是内建命令
13
type cmd
14
type -a echo # --all, 有的命令有内建和外部命令两种实现方式,通过 -a 可以都显示出来
15
16
# 注意,如果一个命令的结果返回的是 xxx is hashed (/bin/xxx),那么该命令就是一个外部命令,为了加快命令的查找速度,将其路径进行 hash.
Copied!

环境变量

Linux 的环境变量指的是系统中的各种重要的变量,环境变量并不是 PATH !环境变量是一系列 key-value 的键值对。我们可以使用 printenv 来查看所有的环境变量。
printenv, env, set
1
# 定义:bash 用一种叫做环境变量的特性来存储有关 shell 会话和工作环境的信息。
2
环境变量
3
\_全局环境变量
4
\_局部环境变量
5
\_用户定义变量
6
\_用户定义局部环境变量
7
\_用户定义全局环境变量
8
9
# 全局环境变量
10
printenv # 查看全局环境变量
11
env # 同上
12
printenv PATH # 查看个别全局环境变量
13
printenv HOME # 同上
14
echo $PATH # 查看环境变量的值
15
16
# 让变量作为命令行参数
17
ls $HOME # 变量可以直接在命令行中使用
18
19
# 局部环境变量
20
# Linux 中没有一个只显示局部变量的命令,set 命令会显示所有变量
21
set # 显示所有的变量
Copied!
创建和删除环境变量
1
# 定义一个局部环境变量,局部环境变量只在 父shell 中生效,不能传递给 子shell,也不能在 exit 后保存
2
my_para="wansho"
3
echo $my_para
4
5
# export
6
# 定义全局环境变量,在 父shell 中生效后,可以传递给 子shell,但是也不能在 exit 后保存;子shell 对于 父shell 的全局环境变量只具有 可读性,无法进行修改、删除的操作,即使修改了,也无法向上传递给 父shell
7
my_para="wansho"
8
export my_para
9
10
# 删除环境变量
11
unset my_para
Copied!

PATH:一个特殊的环境变量

1
# PATH 首先是一个环境变量,然后才是一个特殊的环境变量(全局),其定义了用于进行命令和程序查找的目录。
2
3
# 修改 PATH,加入新的路径
4
PATH=$PATH:new_way # PATH 中的路径都用 : 隔开,通过这种方式修改的环境变量,其效果只能维持到退出或重启系统,不能永久保持环境变量
5
6
# 想要修改后的 path 变量每次开机都生效,就得将 path 的改动写入 $HOME/.profile or /etc/profile (for a system-wide installation)
Copied!

系统环境变量所在地址、固化环境变量、开机启动项

/etc/profile 全局级配置文件
1
# /etc/profile 文件(全系统全局的配置文件)
2
# /etc/profile 文件是系统上默认的 bash shell 的主启动文件。每个用户登陆,都会执行该文件。
3
# 正常情况下,我们可以在该脚本中配置一些全局的环境变量和开机启动项。脚本的内容如下:
4
if [ "$PS1" ]; then
5
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
6
# The file bash.bashrc already sets the default PS1.
7
# PS1='\h:\w\$ '
8
if [ -f /etc/bash.bashrc ]; then
9
. /etc/bash.bashrc
10
fi
11
else
12
if [ "`id -u`" -eq 0 ]; then
13
PS1='# '
14
else
15
PS1='$ '
16
fi
17
fi
18
fi
19
20
if [ -d /etc/profile.d ]; then
21
for i in /etc/profile.d/*.sh; do # 遍历 /etc/profile.d/文件夹中的 sh脚本
22
if [ -r $i ]; then
23
. $i
24
fi
25
done