This commit is contained in:
jaywcjlove 2017-02-07 09:52:56 +08:00
commit 62bdf749ad
3 changed files with 419 additions and 306 deletions

View File

@ -1,75 +1,91 @@
chmod chmod
=== ===
用来变更文件或目录的权限 用来变更文件或目录的权限
## 补充说明 ## 补充说明
**chmod命令** 用来变更文件或目录的权限。在UNIX系统家族里文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限设置方式采用文字或数字代号皆可。符号连接的权限无法变更如果用户对符号连接修改权限其改变会作用在被连接的原始文件。 **chmod命令** 用来变更文件或目录的权限。在UNIX系统家族里文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限设置方式采用文字或数字代号皆可。符号连接的权限无法变更如果用户对符号连接修改权限其改变会作用在被连接的原始文件。
权限范围的表示法如下: 权限范围的表示法如下:
`u` User即文件或目录的拥有者 `u` User即文件或目录的拥有者
`g` Group即文件或目录的所属群组 `g` Group即文件或目录的所属群组
`o` Other除了文件或目录拥有者或所属群组之外其他用户皆属于这个范围 `o` Other除了文件或目录拥有者或所属群组之外其他用户皆属于这个范围
`a` All即全部的用户包含拥有者所属群组以及其他用户 `a` All即全部的用户包含拥有者所属群组以及其他用户
`r` 读取权限数字代号为“4”; `r` 读取权限数字代号为“4”;
`w` 写入权限数字代号为“2” `w` 写入权限数字代号为“2”
`x` 执行或切换权限数字代号为“1” `x` 执行或切换权限数字代号为“1”
`-` 不具任何权限数字代号为“0” `-` 不具任何权限数字代号为“0”
`s` 特殊功能说明:变更文件或目录的权限。 `s` 特殊功能说明:变更文件或目录的权限。
### 语法 ### 语法
``` ```
chmod(选项)(参数) chmod(选项)(参数)
``` ```
### 选项 ### 选项
``` ```bash
-c或——changes效果类似“-v”参数但仅回报更改的部分 u # 操作对象简称用户user文件或目录的所有者。
-f或--quiet或——silent不显示错误信息 g # 操作对象简称同组用户group文件或目录所属群组
-R或——recursive递归处理将指令目录下的所有文件及子目录一并处理 o # 操作对象简称其它用户others
-v或——verbose显示指令执行过程 a # 操作对象简称所有用户all系统默认使用此项
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同; + # 权限操作符,添加某些权限
<权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置; - # 权限操作符,取消某些权限
<权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置; = # 权限操作符,设置文件的权限为给定的权限
<权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置; r # 权限设定(英文),表示可读权限
``` w # 权限设定(英文),表示可写权限
x # 权限设定(英文),表示可执行权限
### 参数 - # 权限设定(英文字符),表示没有权限
X # 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限
权限模式:指定文件的权限模式; s # 权限设定设置权限suid和sgid使用权限组合“u+s”设定文件的用户的ID位“g+s”设置组ID位
文件:要改变权限的文件。 t # 权限设定,只有目录或文件的所有者才可以删除目录下的文件
-c或——changes # 效果类似“-v”参数但仅回报更改的部分如果文件权限已经改变显示其操作信息
### 知识扩展和实例 -f或--quiet或——silent # 操作过程中不显示任何错误信息;
-R或——recursive # 递归处理,将指令目录下的所有文件及子目录一并处理;
Linux用 户分为:拥有者、组群(Group)、其他otherLinux系统中预设的情況下系统中所有的帐号与一般身份使用者以及root的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內! -v或——verbose # 显示命令运行时的详细执行过程;
--reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
linux文件的用户权限的分析图 <权限范围>+<权限设置> # 开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置> # 关闭权限范围的文件或目录的该选项权限设置;
!linux文件的用户权限的分析图 <权限范围>=<权限设置> # 指定权限范围的文件或目录的该选项权限设置;
--help # 显示帮助信息
rwx rw- r-- --version # 显示版本信息
```
r=读取属性  //值4
w=写入属性  //值2 ### 参数
x=执行属性  //值1
权限模式:指定文件的权限模式;
``` 文件:要改变权限的文件。
chmod u+x,g+w f01  //为文件f01设置自己可以执行组员可以写入的权限
chmod u=rwx,g=rw,o=r f01 ### 知识扩展和实例
chmod 764 f01
chmod a+x f01  //对文件f01的u,g,o都设置可执行属性 Linux用 户分为:拥有者、组群(Group)、其他otherLinux系统中预设的情況下系统中所有的帐号与一般身份使用者以及root的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內!
```
linux文件的用户权限的分析图
文件的属主和属组属性设置
!linux文件的用户权限的分析图
```
chown user:market f01  //把文件f01给uesr添加到market组 rwx rw- r--
ll -d f1 查看目录f1的属性
``` r=读取属性  //值4
w=写入属性  //值2
x=执行属性  //值1
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
```bash
chmod u+x,g+w f01  # 为文件f01设置自己可以执行组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01   # 对文件f01的u,g,o都设置可执行属性
```
文件的属主和属组属性设置
```bash
chown user:market f01  # 把文件f01给uesr添加到market组
ll -d f1 查看目录f1的属性
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

View File

@ -1,63 +1,159 @@
free free
=== ===
显示内存的使用情况 显示内存的使用情况
## 补充说明 ## 补充说明
**free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 **free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
### 语法 ### 语法
``` ```
free(选项) free(选项)
``` ```
### 选项 ### 选项
``` ```bash
-b以Byte为单位显示内存使用情况 -b # 以Byte为单位显示内存使用情况
-k以KB为单位显示内存使用情况 -k # 以KB为单位显示内存使用情况
-m以MB为单位显示内存使用情况 -m # 以MB为单位显示内存使用情况
-o不显示缓冲区调节列 -g # 以GB为单位显示内存使用情况。
-s<间隔秒数>:持续观察内存使用状况; -o # 不显示缓冲区调节列;
-t显示内存总和列 -s<间隔秒数> # 持续观察内存使用状况;
-V显示版本信息。 -t # 显示内存总和列;
``` -V # 显示版本信息。
```
### 实例
### 实例
```
free -m ```bash
total used free shared buffers cached free -t # 以总和的形式显示内存的使用信息
Mem: 2016 1973 42 0 163 1497 free -s 10 # 周期性的查询内存使用信息每10s 执行一次命令
-/+ buffers/cache: 312 1703 ```
Swap: 4094 0 4094
``` 显示内存使用情况
**第一部分Mem行解释** ```bash
free -m
``` total used free shared buffers cached
total内存总数 Mem: 2016 1973 42 0 163 1497
used已经使用的内存数 -/+ buffers/cache: 312 1703
free空闲的内存数 Swap: 4094 0 4094
shared当前已经废弃不用 ```
buffers Buffer缓存内存数
cached Page缓存内存数。 **第一部分Mem行解释**
```
```
关系total = used + free total内存总数
used已经使用的内存数
**第二部分(-/+ buffers/cache)解释:** free空闲的内存数
shared当前已经废弃不用
``` buffers Buffer缓存内存数
(-buffers/cache) used内存数第一部分Mem行中的 used buffers cached cached Page缓存内存数。
(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached ```
```
关系total = used + free
可见-buffers/cache反映的是被程序实实在在吃掉的内存而+buffers/cache反映的是可以挪用的内存总数。
**第二部分(-/+ buffers/cache)解释:**
第三部分是指交换分区。
```
(-buffers/cache) used内存数第一部分Mem行中的 used buffers cached
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ --> (+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached
```
可见-buffers/cache反映的是被程序实实在在吃掉的内存而+buffers/cache反映的是可以挪用的内存总数。
第三部分是指交换分区。
输出结果的第四行是交换分区SWAP的也就是我们通常所说的虚拟内存。
区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看第一行是从OS的角度来看因为对于OSbuffers/cached 都是属于被使用所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括内核OS使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程序角度来看对于应用程序来说buffers/cached 是等于可用的因为buffer/cached是为了提高文件读取的性能当应用程序需在用到内存的时候buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。
如本机情况的可用内存为:
18007156=2098428KB+4545340KB+11363424KB
接下来解释什么时候内存会被交换,以及按什么方交换。
当可用内存少于额定值的时候,就会开会进行交换。如何看额定值:
```bash
cat /proc/meminfo
MemTotal: 16140816 kB
MemFree: 816004 kB
MemAvailable: 2913824 kB
Buffers: 17912 kB
Cached: 2239076 kB
SwapCached: 0 kB
Active: 12774804 kB
Inactive: 1594328 kB
Active(anon): 12085544 kB
Inactive(anon): 94572 kB
Active(file): 689260 kB
Inactive(file): 1499756 kB
Unevictable: 116888 kB
Mlocked: 116888 kB
SwapTotal: 8191996 kB
SwapFree: 8191996 kB
Dirty: 56 kB
Writeback: 0 kB
AnonPages: 12229228 kB
Mapped: 117136 kB
Shmem: 58736 kB
Slab: 395568 kB
SReclaimable: 246700 kB
SUnreclaim: 148868 kB
KernelStack: 30496 kB
PageTables: 165104 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 16262404 kB
Committed_AS: 27698600 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 311072 kB
VmallocChunk: 34350899200 kB
HardwareCorrupted: 0 kB
AnonHugePages: 3104768 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 225536 kB
DirectMap2M: 13279232 kB
DirectMap1G: 5242880 kB
```
交换将通过三个途径来减少系统中使用的物理页面的个数: 
1. 减少缓冲与页面cache的大小
2. 将系统V类型的内存页面交换出去 
3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上少量地使用swap是不是影响到系统性能的。
那buffers和cached都是缓存两者有什么区别呢
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式
Buffer Cache和Page Cache。前者针对磁盘块的读写后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
磁盘的操作有逻辑级文件系统和物理级磁盘块这两种Cache就是分别缓存逻辑和物理级数据的。
Page cache实际上是针对文件系统的是文件的缓存在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘这种映射关系由文件系统来完成。当page cache的数据需要刷新时page cache中的数据交给buffer cache因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了没有真正意义上的cache操作。
Buffer cache是针对磁盘块的缓存也就是在没有文件系统的情况下直接对磁盘进行操作的数据会缓存到buffer cache中例如文件系统的元数据都会缓存到buffer cache中。
简单说来page cache用来缓存文件数据buffer cache用来缓存磁盘数据。在有文件系统的情况下对文件操作那么数据会缓存到page cache如果直接采用dd等工具对磁盘进行读写那么数据会缓存到buffer cache。
所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了也是该考虑优化程序或加内存了。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

View File

@ -1,171 +1,172 @@
xargs xargs
=== ===
给其他命令传递参数的一个过滤器 给其他命令传递参数的一个过滤器
## 补充说明 ## 补充说明
**xargs命令** 是给其他命令传递参数的一个过滤器也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式例如多行变单行单行变多行。xargs的默认命令是echo空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白不过通过xargs的处理换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。 **xargs命令** 是给其他命令传递参数的一个过滤器也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式例如多行变单行单行变多行。xargs的默认命令是echo空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白不过通过xargs的处理换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。
### xargs命令用法 ### xargs命令用法
xargs用作替换工具读取输入数据重新格式化后输出。 xargs用作替换工具读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据: 定义一个测试文件,内有多行文本数据:
``` ```
cat test.txt cat test.txt
a b c d e f g a b c d e f g
h i j k l m n h i j k l m n
o p q o p q
r s t r s t
u v w x y z u v w x y z
``` ```
多行输入单行输出: 多行输入单行输出:
``` ```
cat test.txt | xargs cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z
``` ```
**-n选项** 多行输出: **-n选项** 多行输出:
``` ```
cat test.txt | xargs -n3 cat test.txt | xargs -n3
a b c a b c
d e f d e f
g h i g h i
j k l j k l
m n o m n o
p q r p q r
s t u s t u
v w x v w x
y z y z
``` ```
**-d选项** 可以自定义一个定界符: **-d选项** 可以自定义一个定界符:
``` ```
echo "nameXnameXnameXname" | xargs -dX echo "nameXnameXnameXname" | xargs -dX
name name name name name name name name
``` ```
结合 **-n选项** 使用: 结合 **-n选项** 使用:
``` ```
echo "nameXnameXnameXname" | xargs -dX -n2 echo "nameXnameXnameXname" | xargs -dX -n2
name name name name
name name name name
``` ```
**读取stdin将格式化后的参数传递给命令** **读取stdin将格式化后的参数传递给命令**
假设一个命令为 sk.sh 和一个保存参数的文件arg.txt 假设一个命令为 sk.sh 和一个保存参数的文件arg.txt
``` ```
#!/bin/bash #!/bin/bash
#sk.sh命令内容打印出所有参数。 #sk.sh命令内容打印出所有参数。
echo $* echo $*
``` ```
arg.txt文件内容 arg.txt文件内容
``` ```
cat arg.txt cat arg.txt
aaa aaa
bbb bbb
ccc ccc
``` ```
xargs的一个 **选项-I** ,使用-I指定一个替换字符串{}这个字符串在xargs扩展时会被替换掉当-I与xargs结合使用每一个参数命令都会被执行一次 xargs的一个 **选项-I** ,使用-I指定一个替换字符串{}这个字符串在xargs扩展时会被替换掉当-I与xargs结合使用每一个参数命令都会被执行一次
``` ```
cat arg.txt | xargs -I {} ./sk.sh -p {} -l cat arg.txt | xargs -I {} ./sk.sh -p {} -l
-p aaa -l -p aaa -l
-p bbb -l -p bbb -l
-p ccc -l -p ccc -l
``` ```
复制所有图片文件到 /data/images 目录下: 复制所有图片文件到 /data/images 目录下:
``` ```
ls *.jpg | xargs -n1 -I cp {} /data/images ls *.jpg | xargs -n1 -I cp {} /data/images
``` ```
**xargs结合find使用** **xargs结合find使用**
用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题 用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题
``` ```
find . -type f -name "*.log" -print0 | xargs -0 rm -f find . -type f -name "*.log" -print0 | xargs -0 rm -f
``` ```
xargs -0将\0作为定界符。 xargs -0将\0作为定界符。
统计一个源代码目录中所有php文件的行数 统计一个源代码目录中所有php文件的行数
``` ```
find . -type f -name "*.php" -print0 | xargs -0 wc -l find . -type f -name "*.php" -print0 | xargs -0 wc -l
``` ```
查找所有的jpg 文件,并且压缩它们: 查找所有的jpg 文件,并且压缩它们:
``` ```
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
``` ```
**xargs其他应用** **xargs其他应用**
假如你有一个文件包含了很多你希望下载的URL你能够使用xargs下载所有链接 假如你有一个文件包含了很多你希望下载的URL你能够使用xargs下载所有链接
``` ```
cat url-list.txt | xargs wget -c cat url-list.txt | xargs wget -c
``` ```
### 子ShellSubshells ### 子ShellSubshells
运行一个shell脚本时会启动另一个命令解释器.就好像你的命令是在命令行提示下被解释的一样类似于批处理文件里的一系列命令。每个shell脚本有效地运行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。 运行一个shell脚本时会启动另一个命令解释器.就好像你的命令是在命令行提示下被解释的一样类似于批处理文件里的一系列命令。每个shell脚本有效地运行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。
``` ```
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5 cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
``` ```
如果cmd2 是cd /那么就会改变子Shell的工作目录这种改变只是局限于子shell内部cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列子Shell内部定义的变量为局部变量。 如果cmd2 是cd /那么就会改变子Shell的工作目录这种改变只是局限于子shell内部cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列子Shell内部定义的变量为局部变量。
子shell可用于为一组命令设定临时的环境变量 子shell可用于为一组命令设定临时的环境变量
<pre class="PROGRAMLISTING">COMMAND1 ```
COMMAND2 COMMAND1
COMMAND3 COMMAND2
( COMMAND3
IFS=: (
PATH=/bin IFS=:
unset TERMINFO PATH=/bin
set -C unset TERMINFO
shift 5 set -C
COMMAND4 shift 5
COMMAND5 COMMAND4
exit 3 # 只是从子shell退出。 COMMAND5
) exit 3 # 只是从子shell退出。
# 父shell不受影响变量值没有更改。 )
COMMAND6 # 父shell不受影响变量值没有更改。
COMMAND7 COMMAND6
``` COMMAND7
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->