为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
..
也可以用来组成路径:
mkdir fruits
mkdir cars
cd fruits
cd …/cars
另一个特殊路径是 .
,它指代的是当前所在的文件夹。
你也可以使用绝对路径,也就是从根文件夹 /
开始的位置:
cd /etc
Linux 中的 pwd
命令
如果你在文件系统里迷路了,输入 pwd
,它会显示你现在的位置:
pwd
这条命令输出当前所在文件夹的路径。
Linux 中的 mkdir
命令
使用 mkdir
命令创建新的文件夹:
mkdir fruits
这条命令还可以一次创建多个文件夹:
mkdir dogs cars
你也可以添加 -p
参数,创建多个嵌套的文件夹:
mkdir -p fruits/apples
UNIX 命令的参数通常都是这样的形式,只需要在命令的名字之后加上它们,就可以改变命令的工作方式。你可以同时使用多个参数。
你可以通过 Man 页面查找某个命令支持的具体参数,只需要输入 man <命令名>
。现在,你可以试试输入 man mkdir
,来查看这一命令的参数(按下字母q
以退出 Man 页面)。 Man 页面是 UNIX 上非常棒的内置帮助系统。
Linux 中的 rmdir
命令
如上所述,mkdir
命令可以创建文件夹,与之相反,rmdir
命令用来删除文件夹:
mkdir fruits
rmdir fruits
这个命令也可以一次删除多个文件夹:
mkdir fruits cars
rmdir fruits cars
用这个命令删除的文件夹,必须是空的。
如果要删除含有内容的文件夹,这里有一个更通用的命令:rm
,配合 -rf
参数即可同时删除文件夹和其中的文件:
rm -rf fruits cars
请小心操作,这个命令在执行时不会向你确认,而是立刻删除你指定的文件。
用命令行删除文件,是没有回收站存在的,恢复丢失的文件会很难。
Linux 中的 mv
命令
当你有一个文件时,你可以用 mv
命令移动它。只需要指定文件的当前路径和新路径:
touch test
mv pear new_pear
文件 pear
现在被移动到 new_pear
了。这也是为文件和目录进行重命名的方法。
如果你指定的最后路径是一个文件夹,那么前面路径中的文件将被移动到那个文件夹。这时,你可以列出一组要移动的文件,这些文件将被移动到最后一个参数中指定的路径:
touch pear
touch apple
mkdir fruits
mv pear apple fruits #文件 pear 和 apple 被移动到 fruits 文件夹
Linux 中的 cp
命令
cp
命令可以用来复制文件:
touch test
cp apple another_apple
要复制整个文件夹,可以添加 -r
参数来递归复制那个文件夹的内容:
mkdir fruits
cp -r fruits cars
Linux 中的 open
命令
open
命令可以让你打开任意一个文件,格式如下:
open <命令名>
你也可以用它打开目录。在 macOS 上,这个命令会打开访达(Finder)并显示你当前指定的目录:
open <目录名>
我一直使用下面的命令打开当前目录:
open .
特殊符号
.
代指当前目录, 而..
代指上级目录。
此外,它还可以用来打开一个应用程序:
open <应用程序名>
Linux 中的 touch
命令
touch
命令可以用来创建空白的文件:
touch apple
如果指定的文件已经存在,那么它将以写入模式打开文件,文件的时间戳(修改日期)也同时更新。
Linux 中的 find
命令
find
命令可以用来按特定的模式搜索文件和文件夹。它以递归的方式进行搜索。
让我们通过几个例子来学习它的用法。
你可以用下面的命令,查找当前目录树下所有扩展名为 .js
的文件,并输出每个匹配文件的相对路径:
find . -name ‘*.js’
在星号(*
)等特殊字符周围打上引号是很重要的,这可以避免 Shell 弄错它们的意义。
如果要查找在当前目录树下,所有与"src"这一名称匹配的目录,请输入:
find . -type d -name src
同理,如果只搜索文件,可以使用 -type f
参数;如果只搜索符号链接,可以使用 -type l
参数。
-name
参数对于大小写敏感。如果不需要区分大小写,你应该使用 -iname
参数。
你可以在不同的根目录树下搜索文件:
find folder1 folder2 -name filename.txt
要在当前目录树下搜索名称为 “node_modules” 或是 ‘public’ 的目录,请输入:
find . -type d -name node_modules -or -name public
你可以用 -not -path
参数排除某个路径:
find . -type d -name ‘.md’ -not -path 'node_modules/’
你还可以搜索当前目录树中内容超过 100 个字符(字节)的文件:
find . -type f -size +100c
搜索大于 100KB,但小于 1MB 的文件:
find . -type f -size +100k -size -1M
搜索至少 3 天前编辑的文件:
find . -type f -mtime +3
搜索最近 24 小时编辑的文件:
find . -type f -mtime -1
你可以使用 -delete
参数同步删除搜索到的文件。比如,下面的命令会删除最近 24 小时编辑的文件:
find . -type f -mtime -1 -delete
你还可以在每个搜索结果上同时运行某个命令。在这里,我们运行 cat
来输出搜索到的文件的内容:
find . -type f -exec cat {} ;
请注意结尾的 \;
。 命令执行时,搜索结果中的文件名会被自动填入花括号 {}
。
Linux 中的 ln
命令
ln
命令是 Linux 诸多文件系统命令的一部分。
它的用途是创建链接。“链接”是什么?链接就像是指针,指向另一个文件,或者说是指向另一个文件的文件。你可能熟悉 Windows 上的快捷方式,二者是类似的。
我们有两种类型的链接:硬链接和软链接。
硬链接
硬链接现在很少使用。它有一些弱点:你无法链接到目录,也无法链接到外部文件系统(磁盘驱动器)。
要创建一个硬链接,可以使用下面的语法:
ln <源文件路径> <链接路径>
例如,你有一个叫做 recipes.txt 的文件,你可以用下面的写法创建一个硬链接:
ln recipes.txt newrecipes.txt
这个新创建的硬链接和普通的文件没有什么区别:
现在,如果你编辑这对文件中的任何一个,另一个文件的内容也会随之更新。
即使你删除了源文件,链接文件仍然会包含源文件的内容。那是因为直到创建硬链接时,源文件还没有被删除。
软链接
软链接则有所不同,它更为强大一些,你可以用它链接到其他的文件系统和目录。但请注意,当你删除源文件时,这个链接会断掉。
你可以使用 ln
命令的 -s
参数创建一个软链接:
ln -s <源文件路径> <链接路径>
例如,你有一个叫做 recipes.txt 的文件。你可以用下面的写法为它创建一个软链接:
ln -s recipes.txt newrecipes.txt
这种情况下,当你用 ls -al
列出文件时,你可以看见一个特殊的 l
标记。在文件名的末尾有一个 @
符号,如果你启用了终端的显色,文件名还会有不同的颜色:
现在,如果你删除源文件,链接就会断掉,如果你在终端里尝试访问它,Shell 会提示 “No such file or directory” (没有这个文件或目录):
Linux 中的 gzip
命令
你可以使用 gzip
命令,从而使用一种称为 LZ77 的 gzip 压缩协议,来压缩文件。
以下是最简单的用法:
gzip 文件名
这会压缩指定的文件,并为它加上 .gz
扩展名。源文件会被删除。
如果不想删除源文件,你可以加上 -c
参数,然后使用输出重定向,将输出文件写到 filename.gz
中。
gzip -c filename > filename.gz
-c
参数用来指定输出文件进入标准输出流,同时保持原始文件的完整性。
或者使用 -k
参数:
gzip -k 文件名
文件有不同的压缩率。压缩率越高,压缩(或者解压)的时间就越长。压缩率等级一般从 1(速度最快,压缩效果最差)开始,直到 9 (速度最慢,压缩效果更好)结束。默认为 6 。
你可以用 -<数字>
参数指定使用的压缩率:
gzip -1 文件名
你可以压缩多个文件,只需要依次列出它们:
gzip file1 file2
你可以用递归的方式压缩某个目录包含的全部文件,只需要使用 -r
参数:
gzip -r 文件夹路径
-v
参数会输出文件压缩时的百分比信息。以下是它和 -k
(Keep 的简写) 参数并用时的情形:
gzip
命令也可以用来解压文件,只需使用 -d
参数:
gzip -d filename.gz
Linux 中的 gunzip
命令
gunzip
命令与 gzip
命令基本等同,但前者总是默认启用后者的 -d
参数。
可以用下面的方式调用这个命令:
gunzip filename.gz
这会执行解压,将压缩文件的 .gz
扩展名去除,并将结果放进 filename
文件中。如果相应文件已经存在,将会被提取结果覆盖。
你可以加上 -c
参数,使用输出重定向,将压缩文件解压到不同的文件名:
gunzip -c filename.gz > 另一个文件名
Linux 中的 tar
命令
tar
命令可以用来创建档案包,将多个文件打包为一个文件。
它的名称来源于旧时,意思是 tape archive(磁带档案) (很久以前档案都是用磁带存储的)。
下面的命令会将 file1
和 file2
打包成一个名为 archive.tar
的档案包文件:
tar -cf archive.tar file1 file2
c
参数是 create(创建) 的简写。f
参数则用来将合成的档案包写入一个文件。
要在当前文件夹下的某个档案包中提取文件,可以使用如下命令:
tar -xf archive.tar
参数
x
是 extract(提取) 的简写。
如果要提取文件到指定目录,应该使用下面的命令:
tar -xf archive.tar -C 目录路径
你也可以不提取文件,只罗列某个档案包里含有的文件列表:
tar
常用来创建压缩档案包。
这可以用 z
参数来完成:
tar -czf archive.tar.gz file1 file2
这就像是先创建了一个 tar 档案包,再运行 gzip
来压缩它。
如果你要提取一个被压缩的档案包,可以先使用 gunzip
或 gzip -d
来解压,再提取里面的文件。除此之外 tar -xf
也可以直接识别压缩的档案包,然后为你完成解压提取操作:
tar -xf archive.tar.gz
Linux 中的 alias
命令
通常情况下,人们总会使用一组喜欢的参数去运行一个程序。
此处用 ls
命令举例。默认情况下,它只输出少量的信息:
但如果你带上了 -al
参数,它会输出一些更有用的信息,像是文件的修改日期、大小、所有者、权限之类。它也会同时列出隐藏的文件(文件名以英文句号.
开头的文件):
你可以创建一个新的命令,比如我喜欢叫它 ll
,它是 ls -al
命令的一个别名。
方法如下所示:
alias ll=‘ls -al’
只要这么做了,你就可以像使用普通的 UNIX 命令一样,调用 ll
:
当调用 alias
,但不加任何参数时,它会列出已经定义的所有别名:
用以上方法定义的别名,在终端会话关闭后就会失效。
如果要让别名永久有效,你必须将其添加到 Shell 的配置文件中。如果你正在使用 Bash shell,配置文件可能是 ~/.bashrc
、~/.profile
或 ~/.bash_profile
,依据实际用法而定。
如果你定义的命令中存在变量,那么请注意引号的用法:如果使用双引号,变量会在进行定义时解析;如果使用单引号,变量则会在命令被调用时解析。两者是不同的:
alias lsthis=“ls $PWD”
alias lscurrent=‘ls $PWD’
$PWD 代表 Shell 当前所在的文件夹。如果你导航到新的文件夹,lscurrent
命令会列出新文件夹中的文件,而 lsthis
仍然会列出你首次定义变量时所在文件夹中的文件。
Linux 中的 cat
命令
cat
命令与后面会介绍到的 tail 命令有些相似,但 cat
命令可以向任一文件添加内容,这就使得它非常强大。
cat
最简单的用法是将任一文件的内容打印到标准输出中:
cat 文件名
你可以打印输出多个文件的内容:
cat file1 file2
配合输出重定向操作符 >
,你可以把多个文件的内容拼接成一个新的文件:
cat file1 file2 > file3
使用操作符 >>
,你可以将多个文件的内容附加到任一文件中,如果目标文件不存在,则会新建一个:
cat file1 file2 >> file3
当查看源代码时,读取行数是非常有用的。使用 cat
的参数 -n
即可完成:
cat -n file1
使用 -b
参数可以(同时也只能)向文件的非空行添加一个数字。而使用 -s
参数则可以移除文件中所有的多行空行。
cat
经常和管道符 |
一并使用,可以将任一文件的内容输入给另一个命令使用: cat 文件名1 | 另一个命令
。
Linux 中的 less
命令
less
是我经常使用的命令之一。它透过一个漂亮的交互用户界面向你展示任一文件中存储的内容:
用法: less <文件名>
.
当你处于 less
会话时,按下 q
键即可离开。
你可以使用 上
键和 下
键浏览文件的内容,或者使用 空格
键和 b
键逐页浏览。按下 G
键(大写)可以跳转到文件的末尾,而按下 g
键(小写)则可以回到文件的开头。
按下左斜杠键 /
并输入文字,就可以在文件中进行搜索。这会 向前 搜索。如果要向后搜索,你需要使用问号 ?
并输入文字。
这个命令只是将文件的内容可视化。你可以直接按 v
打开一个编辑器。它将使用系统编辑器,在大多数情况下是 vim
。
按 F
键即可进入 跟踪模式,也称 观察模式。当文件被别人修改时,比如从另一个程序中修改,你就可以 实时 看到修改的内容。
默认状态下不会出现这种情况,你只能看到你打开文件时的文件版本。你需要按 ctrl-C
来退出这个模式。在这种情况下,行为类似于运行 tail -f <文件名>
命令。
你可以打开多个文件,并使用 :n
(next,转到下一个文件)和 :p
(previous,转到上一个文件)浏览它们。
Linux 中的 tail
命令
在我看来,tail 命令的最佳用法是带上 -f
参数一起调用。它会打开并显示文件最末尾的内容,并实时监控文件的改动。
有新内容进入文件时,它就将其输出到终端窗口中。这对于查看日志文件是非常棒的。例如:
tail -f /var/log/system.log
要退出,就按下 ctrl-C
.
使用以下命令,你可以输出任一文件的最后十行内容:
tail -n 10 <文件名>
你还可以在行号前添加加号 +
指定从文件的某一行开始输出之后的所有内容:
tail -n +10 <文件名>
tail
还可以做更多的事情,像往常一样,我建议你去查询 man tail
了解更多。
Linux 中的 wc
命令
wc
命令会为我们显示关于指定文件(或透过管道符接收的参数)的有用信息。
echo test >> test.txt
wc test.txt
1 1 5 test.txt
以下是透过管道符的例子,我们可以利用它来给 ls -al
命令的运行输出计数:
ls -al | wc
6 47 284
第一列返回的是行数,第二列是字数,第三列则是比特数。
我们可以让它只计算行数:
wc -l test.txt
或者只计算字数:
wc -w test.txt
或者只计算比特数:
wc -c test.txt
在 ASCII 字符集中,比特数等于字符数。但对于非 ASCII 字符集,由于一些字符可能占用多个比特,字符的数目可能会不同(这在 Unicode 里有发生过)。
这种情况下使用 -m
参数可以得到正确的数目:
wc -m test.txt
Linux 中的 grep
命令
grep
命令是一个非常有用的工具。假若掌握了它,对日常的编码工作会有很大的帮助。
如果你比较好奇,
grep
的全写是 global regular expression print (全局正则表达式打印)。
你可以使用 grep
在文件中进行搜索,或者与管道符配合使用,将输出结果传递到其他命令。
例如,可以用以下命令在 index.md
文件里搜寻 document.getElementById
这一行出现的次数:
grep -n document.getElementById index.md
使用 -n
参数可以显示行号:
grep -n document.getElementById index.md
一个非常有用的方法是告诉 grep 在相应行的前后各输出 2 行,以提供更多的上下文。这可以用参数 -C
来完成,它可以受取其后的若干行数:
grep -nC 2 document.getElementById index.md
搜索默认是区分大小写的。使用参数 -i
可以使其不再区分。
如上所述,你可以使用 grep 来过滤其他命令的输出。我们可以使用以下方法重现前述的功能:
less index.md | grep -n document.getElementById
搜索字符串中可以使用正则表达式,这让 grep
变得非常强大。
另一个你可能发现很有用的方法是——使用参数 -v
反转结果,排除与特定字符串匹配的行:
Linux 中的 sort
命令
假定你有一份文本文件,里面包含一些狗狗的名字:
这串名字并没有进行排序。
而 sort
命令会帮你按照名称顺序排列它们:
使用 r
参数倒转排序结果:
默认情况下,排序区分大小写,并且遵循英文字母顺序。使用 --ignore-case
参数进行不区分大小写的排序,使用 -n
参数可按数值大小顺序进行排序。
如果文件包含重复的行:
你可以使用 -u
参数移除它们:
sort
命令不像多数 UNIX 命令那样,只是用于操作文件,它还可以与管道符配合使用。因此你可以将它用在其他命令的输出上。例如,你可以用它排序 ls
命令传回的文件列表:
ls | sort
sort
的功能非常强大,它还支持更多的参数,你可以输入 man sort
来探索:
Linux 中的 uniq
命令
uniq
命令可以帮助你排序文本文件中的行。
这些行可以通过文件获取,或用管道符从另一个命令的输出中得到:
uniq dogs.txt
ls | uniq
此处需要考虑一个关键点: uniq
只会检测相邻的重复行。
这意味着你可能会将它与 sort
配合使用:
sort dogs.txt | uniq
sort
命令拥有自己的参数—— -u
(unique) 来移除重复的行。但 uniq
更为强大。
默认情况下,它会删除重复的行:
你可以告诉它只是显示重复的行,例如,使用 -d
参数:
sort dogs.txt | uniq -d
还可以使用 -u
参数,那样就只会显示不重复的行:
使用 -c
参数计算每一行的出现次数:
使用以下的特殊命令组合:
sort dogs.txt | uniq -c | sort -nr
即可将文件内的行按最常见的频率排序:
Linux 中的 diff
命令
diff
是一个非常方便的命令。假定有两个文件,它们包含几乎相同的信息,你没有办法找出区别。
diff
会处理文件,然后告诉你有差异的地方。
假定有两个文件: dogs.txt
和 moredogs.txt
。它们的区别是: moredogs.txt
比前者多了一条狗狗的名字:
diff dogs.txt moredogs.txt
会告诉你后者多了一行,在第 3 行有 Vanille
这一行:
如果你改变两个文件的顺序,它会告诉你后者的第三行丢失了,也就是 Vanille
那一行:
使用 -y
参数会逐行对比两个文件:
你可能更熟悉 -u
参数,因为在 Git 版本管理系统中,它一样是用来显示不同版本文件差异的:
对于目录,比较的方式是一样的。你必须使用 -r
选项来进行递归比较(进入子目录):
如果你只对哪个文件存在差异感兴趣,而非关注文件的内容,可以使用 r
和 q
参数:
它还支持更多参数,你可以用 man 页面来探索,只需键入 man diff
:
Linux 中的 echo
命令
echo
命令会做一件简单的事情:它将传递给自身的参数打印输出。
以下示例:
echo “hello”
会将 hello
输出到终端。
我们可以将输出追加到文件中:
echo “hello” >> output.txt
我们可以对环境变量进行插值:
echo “The path variable is $PATH”
注意,特殊字符需要用反斜杠进行转义。以 $
为例:
这只是个开始。当与 Shell 功能交互时,我们可以用它来做一些很棒的事情。
我们可以输出当前文件夹中的文件:
echo *
我们还可以输出当前文件夹中所有以字母 o
开头的文件:
echo o*
任何有效的 Bash(或者是你使用的其他 Shell)命令和功能可以在此使用。
你可以输出你的主文件夹(home)的路径:
echo ~
你还可以执行命令,并且将执行结果打印到标准输出(或者是文件,正如你看到的):
echo $(ls -al)
注意,输出在默认情况下不保留空白。如需留白,必须用双引号来包裹命令:
你可以用它生成字符串列表,例如指定一个范围:
echo {1…5}
Linux 中的 chown
命令
在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件或目录都有所有者。
所有者可以对文件做任何事情。它可以决定文件的命运。
使用 chown
命令,所有者(以及 root
用户)也可以将文件所有权转移给另一个用户:
chown <所有者> <文件>
像这样:
chown flavio test.txt
例如,假设有一个为 root
所拥有的文件,作为其他用户,你无法对它进行写入:
你可以使用 chown
将文件所有权转移到你:
一种需求十分常见:改变目录的所有权,同时遍历修改其中包含的文件、子目录以及子目录中的文件的所有权。
你可以使用 -R
参数来完成:
chown -R <所有者> <文件>
文件和目录不仅属于所有者,同时还属于用户组。使用以下命令,你可以在变更所有者的同时,更改其所属用户组:
chown <所有者>:<用户组> <文件>
举例:
chown flavio:users test.txt
你还可以使用 chgrp
命令,只更改文件的所属用户组:
chgrp <用户组> <文件名>
Linux 中的 chmod
命令
在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件都有三种权限:读取、写入和执行。
进入一个文件夹,并运行 ls -al
命令。
你在文件列表每一行见到的,像是 drwxr-xr-x
这样的奇怪字符串,定义了文件或文件夹的权限。
让我们来剖析一下。
第一个字母表示文件的类型:
-
-
表示这是一个常规的文件 -
d
表示这是一个目录 -
l
表示这是一个链接
之后你就有了三组值:
-
第一组代表文件所有者拥有的权限
-
第二组代表文件所关联的用户组成员拥有的权限
-
第三组代表其他人拥有的权限
这些组由三个值组成。rwx
代表特定 角色 拥有读取、写入和执行访问权限。任何被移除的权限会被替换为 -
,因此你可以将不同的值,及其代表的相关权限进行组合:例如 rw-
、r--
、r-x
等等。
你可以使用 chmod
命令来改变一个文件的权限。
chmod
有两种用法。其一是使用符号参数,其二是使用数字参数。首先来试试更为直观的符号参数。
终端输入 chmod
,空格,之后加上一个字母:
-
a
表示 all,即全体 -
u
表示 user,即用户 -
g
表示 group,即用户组 -
o
表示 others,即其他人
然后输入 +
或 -
并加上一个或多个权限符号(r
、w
、x
),来添加或删除任意权限。
键入以上所有命令和参数之后,都要加上文件或文件夹名称。
以下是一些例子:
chmod a+r filename #每个人都可以读取
chmod a+rw filename #每个人都可以读取和写入
chmod o-rwx filename #其他人(非文件所有者,也不在文件所属用户组中的用户)无法读取、写入或执行文件
只需要在 +
/-
前添加多个字母,即可将相同的权限批量应用到不同的身份:
chmod og-r filename #其他人,和用户组无法读取文件。
如果你正在编辑一个文件夹,你可以使用 -r
(递归)参数将权限应用到该文件夹中的每个文件。
使用数字参数速度更快,但我认为当你不是每天都使用的话,是很难记住它们的。数字在此代表任一角色的权限。这个数字值最大可以是7,它是这样计算的:
-
拥有执行权限,记为
1
-
拥有写入权限,记为
2
-
拥有读取权限,记为
4
这又给我们带来四种组合:
-
0
代表无权限 -
1
代表可以执行 -
2
代表可以写入 -
3
代表可以写入和执行 -
4
代表可以读取 -
5
代表可以读取和执行 -
6
代表可以读取和写入 -
7
代表可以读取、执行和写入
我们使用三组数字,来同时设置所有 3 个用户身份的全部权限:
chmod 777 filename
chmod 755 filename
chmod 644 filename
Linux 中的 umask
命令
创建一个文件时,不需要事先决定权限。权限有默认值。
这些默认值可以使用 umask
命令来控制和修改。
不带参数输入 umask
,它会显示当前的 umask 值,本例中为 0022
:
0022
是什么意思? 这是一个代表权限的八进制数值。
另一个常见的数值是 0002
.
使用 umask -S
查看更具可读性的注释:
在这里,用户(u
),也就是文件的所有者,拥有对文件的读取、写入和执行的权限。
和所有者位于同一用户组的用户(g
)拥有对文件的读取和执行权限,除此之外的其他用户(o
)也一样。
在数字符号中,我们通常会改变最后3位数字。
以下列表给出了这些数字的含义:
-
0
代表读取、写入与执行 -
1
代表读取与写入 -
2
代表读取与执行 -
3
代表只读 -
4
代表写入与执行 -
5
代表仅写入 -
6
代表仅执行 -
7
代表没有权限
注意,这里的数字含义与前述 chmod
命令中用到的并不同。
可以用数值格式,为权限掩码设置一个新的值:
umask 002
也可以更改特定角色的权限:
umask g+r
Linux 中的 du
命令
du
命令会计算整个目录的大小:
du
这里的 32
是一个单位为字节(Byte)的值。
运行 du *
会单独计算每个文件的大小:
你也可以执行 du -m
或 du -g
,以兆字节(MB)或千兆字节(GB)为单位显示文件大小。
使用 -h
选项,会显示更为可读的,适应大小的数值:
添加 -a
选项同样会输出文件夹中每一个文件的大小:
一个方便的做法是按大小对目录进行排序:
du -h | sort -nr
然后通过管道输出到 head
,从而仅获取前 10 个结果:
Linux 中的 df
命令
df
命令用来获取磁盘的使用情况信息。
它的基础形式会输出当前挂载的磁盘卷信息:
使用 -h
参数 (df -h
)会将值以更为可读的方式显示:
你也可以指定任一文件或目录名,以获取其所在的特定卷的信息:
Linux 中的 basename
命令
假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
basename /Users/flavio/test.txt
会返回 text.txt
字符串:
如果你在任一指向目录的路径字符串上执行 basename
,你会得到路径的最后一节。在以下例子中,/Users/flavio
是一个目录:
Linux 中的 dirname
命令
假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
dirname /Users/flavio/test.txt
会返回 /Users/flavio
字符串:
Linux 中的 ps
命令
电脑每时每刻都在运行大量不同的进程。
你可以用 ps
命令检查它们:
这是当前会话中运行的,由用户发起的进程列表。
此处我打开了一些 fish
Shell 实例,大多数是在 VS Code 编辑器内部启动的,还运行了一个 Hugo 实例,用来生成网站的开发预览。
这些只是分配给当前用户的命令。要列出所有进程,我们需要给 ps
传递一些参数。
我最常使用的命令是 ps ax
:
a
参数用来同时列出其他用户的进程。x
显示那些未与终端相连的进程(不是由用户通过终端发起的)。
如你所见,较长的命令被截断了。使用 ps axww
继续在新的行上列出命令,而非截断。
我们需要输入
w
两次来应用这个设置(这不是笔误)。
你可以配合使用 grep
和管道符来搜索特定的进程,比如像这样:
ps axww | grep “Visual Studio Code”
ps
返回的列表达了一些重要信息。
第一个信息是 PID
,也就是进程 ID。当你想在另一个命令中引用这个进程时,比如说要杀死它,这是关键的。
然后是 TT
,它告诉我们进程所使用的终端 ID。
接下来 STAT
告诉我们进程的状态:
I
代表闲置的进程(睡眠时间超过约 20 秒)
R
代表可运行的进程
S
代表睡眠时间少于 20 秒的进程
T
代表已停止的进程
U
代表处于不间断等待中的进程
Z
代表已死亡的进程(zombie,即僵尸进程)
如果出现一个以上的字母,那么第二个字母代表进一步的、可能非常有技术性的信息。
常见的是 +
,它代表相应进程在终端中处于前台。而 s
代表相应进程是一个 会话领头进程(session leader).
TIME
则告诉我们进程已经运行了多长时间。
Linux 中的 top
命令
top
命令用来显示系统中正在运行的进程的动态实时信息。
如果要了解系统发生了什么,这条命令真的很方便。
它的用法很简单。你只需要输入 top
,终端会完全沉浸到新的视图中:
这个进程是持续运行的。要退出,你可以输入字母 q
或按下 ctrl-C
。
它给出了很多信息:进程数量、有多少进程在运行或休眠、系统负载、CPU 使用率,还有更多信息。
在下方,占用 CPU 和内存资源最多的进程列表不断刷新。
默认情况下,进程按 CPU 使用率排列,正如你在高亮标记的 %CPU
列中看到的那样。
你可以添加一个参数,要求进程列表按内存利用率排列:
top -o mem
Linux 中的 kill
命令
Linux 进程可以接收信号并做出反应。
这是我们与运行中进程打交道的一种方式。
kill
程序可以向任一程序发送多种信号。
虽然这个命令的名字暗示了它的主要功能,但它不只是用来终止程序的。
它的用法是:
kill
默认情况下,它会向指定的进程 ID 发送 TERM
信号。
我们可以使用参数来发送其它信号,包括以下这些:
kill -HUP
kill -INT
kill -KILL
kill -TERM
kill -CONT
kill -STOP
HUP
代表 hang up(挂起)。 如果在终止进程之前,先关闭了启动它的终端窗口,这一信号将被自动发送。
INT
代表 interrupt(干扰),这个信号和在终端中按下 ctrl-C
组合键的作用一样,常常用来终结进程。
KILL
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止并终结。
TERM
代表 terminate(终结)。这是本命令的默认信号,进程收到它会自主终结。
CONT
代表 continue(继续)。它可以用来恢复一个被停止的进程。
STOP
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止(但不终结)。
有时你也会见到用数字表示状态的情况,例如 kill -1 <PID>
。在这种情况下,
1
对应 HUP
2
对应 INT
9
对应 KILL
15
对应 TERM
18
对应 CONT
15
对应 STOP
Linux 中的 killall
命令
与 kill
命令类似, killall
也向进程发送状态信号,但区别是后者可以同时向多个进程发送信号,而非前者只能向单个进程 ID 发送信号。
这是它的命令语法:
killall
name
也就是进程的名字。例如,假设有多个 top
程序的实例在运行, killall top
命令将完全终结它们。
你可以指定某一个信号,就像使用 kill
命令那样(请向上翻阅 kill
命令的指南以了解更多具体可以发送的信号),例如:
killall -HUP top
Linux 中的 jobs
命令
当我们在 Linux / macOS 中运行命令时,我们可以在末尾加入 &
符号,使其在后台运行。
例如,让 top
命令在后台运行:
top &
这对于需要长时间运行的程序来说很方便。
要返回切入后台的程序,可以使用 fg
命令。如果后台只有一个作业进程,那么直接使用就好;否则要在后面加上作业进程的号码,如: fg 1
、fg 2
,以此类推。
要获取作业进程号,我们可以使用 jobs
命令。
假设我们运行了 top &
,之后再运行 top -o mem &
,因而我们有两个 top 实例在运行。此时 jobs
命令会这样告诉我们:
现在我们可以利用 fg <作业号>
切回任意一个实例。要再次终止程序,可以按下 cmd-Z
。
运行 jobs -l
也会列出每一个作业的进程 ID。
Linux 中的 bg
命令
当命令执行时,你可以按下 ctrl-Z
暂停它。
按下后,命令会即刻停止,并将你带回到 Shell 终端。
你可以恢复命令在后台的执行,这样既可以使命令保持运行,同时又不会妨碍你在终端中做其他工作。
在这一例子中,有 2 个命令停止了:
运行 bg 1
即可在后台恢复作业 #1 的执行。
我也可以不带任何参数执行 bg
命令,它会默认选取作业列表中的 #1 项。
Linux 中的 fg
命令
当命令在后台运行时,由于此前你已经在命令末尾加上了 &
(例如 top &
,或是使用了 bg
命令将命令放到后台),此时你可以用 fg
命令将其切换回前台。
执行
fg
它将在前台恢复最后被暂停的作业。
你也可以加上作业号,即可指定任一你想在前台恢复的作业,作业号可以使用 jobs
命令获得。
执行 fg 2
将恢复作业 #2:
Linux 中的 type
命令
命令可分为以下四种类型:
-
可执行程序
-
Shell 内置程序
-
Shell 功能
-
命令别名
如果你很想知道或只是很好奇,type
命令可以帮你分清这些。它会告诉你某一命令如何被解析。
输出根据 Shell 的类型而有所不同,这是在 Bash 中的样子:
这是在 Zsh 中的样子:
这是在 Fish 中的样子:
最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
否则要在后面加上作业进程的号码,如: fg 1
、fg 2
,以此类推。
要获取作业进程号,我们可以使用 jobs
命令。
假设我们运行了 top &
,之后再运行 top -o mem &
,因而我们有两个 top 实例在运行。此时 jobs
命令会这样告诉我们:
现在我们可以利用 fg <作业号>
切回任意一个实例。要再次终止程序,可以按下 cmd-Z
。
运行 jobs -l
也会列出每一个作业的进程 ID。
Linux 中的 bg
命令
当命令执行时,你可以按下 ctrl-Z
暂停它。
按下后,命令会即刻停止,并将你带回到 Shell 终端。
你可以恢复命令在后台的执行,这样既可以使命令保持运行,同时又不会妨碍你在终端中做其他工作。
在这一例子中,有 2 个命令停止了:
运行 bg 1
即可在后台恢复作业 #1 的执行。
我也可以不带任何参数执行 bg
命令,它会默认选取作业列表中的 #1 项。
Linux 中的 fg
命令
当命令在后台运行时,由于此前你已经在命令末尾加上了 &
(例如 top &
,或是使用了 bg
命令将命令放到后台),此时你可以用 fg
命令将其切换回前台。
执行
fg
它将在前台恢复最后被暂停的作业。
你也可以加上作业号,即可指定任一你想在前台恢复的作业,作业号可以使用 jobs
命令获得。
执行 fg 2
将恢复作业 #2:
Linux 中的 type
命令
命令可分为以下四种类型:
-
可执行程序
-
Shell 内置程序
-
Shell 功能
-
命令别名
如果你很想知道或只是很好奇,type
命令可以帮你分清这些。它会告诉你某一命令如何被解析。
输出根据 Shell 的类型而有所不同,这是在 Bash 中的样子:
这是在 Zsh 中的样子:
这是在 Fish 中的样子:
最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!