root 5 years ago
parent 3f671c4e40
commit eb9dda2116

@ -0,0 +1,129 @@
# **7z**
## 选项
```markdown
Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
[<@listfiles...>]
<Commands>
a : Add files to archive
b : Benchmark
d : Delete files from archive
e : Extract files from archive (without using directory names)
h : Calculate hash values for files
i : Show information about supported formats
l : List contents of archive
rn : Rename files in archive
t : Test integrity of archive
u : Update files to archive
x : eXtract files with full paths
<Switches>
-- : Stop switches parsing
-ai[r[-|0]]{@listfile|!wildcard} : Include archives
-ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
-ao{a|s|t|u} : set Overwrite mode
-an : disable archive_name field
-bb[0-3] : set output log level
-bd : disable progress indicator
-bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
-bt : show execution time statistics
-i[r[-|0]]{@listfile|!wildcard} : Include filenames
-m{Parameters} : set compression Method
-mmt[N] : set number of CPU threads
-o{Directory} : set Output directory
-p{Password} : set Password
-r[-|0] : Recurse subdirectories
-sa{a|e|s} : set Archive name mode
-scc{UTF-8|WIN|DOS} : set charset for for console input/output
-scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
-scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
-sdel : delete files after compression
-seml[.] : send archive by email
-sfx[{name}] : Create SFX archive
-si[{name}] : read data from stdin
-slp : set Large Pages mode
-slt : show technical information for l (List) command
-snh : store hard links as links
-snl : store symbolic links as links
-sni : store NT security information
-sns[-] : store NTFS alternate streams
-so : write data to stdout
-spd : disable wildcard matching for file names
-spe : eliminate duplication of root folder for extract command
-spf : use fully qualified file paths
-ssc[-] : set sensitive case mode
-ssw : compress shared files
-stl : set archive timestamp from the most recently modified file
-stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
-stx{Type} : exclude archive type
-t{Type} : Set type of archive
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
-v{Size}[b|k|m|g] : Create volumes
-w[{path}] : assign Work directory. Empty path means a temporary directory
-x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
-y : assume Yes on all queries
p7zip p7zip-plugins
```
# 支持的zip格式压缩方法
* 0 - Store
* 1 - Shrink (decompression only)
* 6 - Implode (decompression only)
* 8 - Deflate
* 9 - Deflate64
* 12 - BZip2
* 14 - LZMA
* 95 - xz (decompression only)
* 98 - PPMd
* 99 - WinZip AES
# 支持的7z格式压缩方法
| 压缩方法 | 描述 |
| :------: | :------: |
| LZMA | Improved and optimized version of LZ77 algorithm |
| LZMA2 | LZMA-based compression method. It provides better multithreading support than LZMA |
| PPMD | Dmitry Shkarin's PPMdH with small changes |
| BCJ | Converter for 32-bit x86 executables |
| BCJ2 | Converter for 32-bit x86 executables |
| BZip2 | Standard BWT algorithm |
| Deflate | Standard LZ77-based algorithm |
# 退出码含义
| Code | Meaning |
| :------: | :------: |
| 0 | No error |
| 1 | Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed. |
| 2 | Fatal error |
| 7 | Command line error |
| 8 | Not enough memory for operation |
| 255 | User stopped the process |
## 实例
```bash
7z a -r achive.7z /home # 压缩home目录-r可以省略
7z e archive.7z -o/home # 解压文件到home目录
7z x archive.7z # 以完整路径解压文件
7z u archive.7z *.doc # 更新所有doc文件并压缩到archive压缩包中
7z d -r archive.7z *.log # 从压缩包删除文件,删除压缩包所有后缀为log文件
7z l archive.7z # 列出压缩包中文件
7z t -r archive.7z *.doc # 测试压缩包中的所有doc文件
# 7z压缩文件-t7z可以省略/root/achive.7z表示将压缩文件放到root目录下-m0=LZMA2 -mx表示以LZMA2算法等级是9(0-9)-aoa直
# 接覆盖现有文件,-mmt多线程(30个线程)加速压缩,-y默认允许所有-pSECRET表示密码是SECRET-bb3设置输出日志文件等级(0-3)
# -bsp1将命令输出写入到out.log文件
7z a -r -t7z /root/achive.7z /home -m0=LZMA2 -mx=9 -aoa -mmt=30 -y -pSECRET -bb3 -bsp1 > out.log
```
## 恢复损坏的7z压缩包
错误类型有两种:
* 解压或测试时提示数据错误或CRC错误
* 打开时,提示:文件'a.7z'作为存档无法打开

@ -2,79 +2,38 @@
## 说明
**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起大体就如同Windows上的安装文件。
**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个
应用的文件包在一起大体就如同Windows上的安装文件
```
-c指定配置文件。
```
### 参数
* 管理指令对APT软件包的管理操作
* 软件包:指定要操纵的软件包。
### 实例
## 选项
使用apt-get命令的第一步就是引入必需的软件库Debian的软件库也就是所有Debian软件包的集合它们存在互联网上的一些公共站点上。把它们的地址加入apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件其格式如下
```markdown
```
deb web或[ftp地址] [发行版名字] main/contrib/non-[free]
```
我们常用的Ubuntu就是一个基于Debian的发行我们使用apt-get命令获取这个列表以下是我整理的常用命令
## 实例
在修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的:
```markdown
使用apt-get命令的第一步就是引入必需的软件库Debian的软件库也就是所有Debian软件包的集合它们存在互联网上的一些公共
站点上。把它们的地址加入apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件其格式如下
deb web或[ftp地址] [发行版名字] main/contrib/non-[free]
```
修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。需要定期运行这一命令以确保您的软件包列表是最新的:
apt-get update
```
安装一个新软件包:
```
apt-get install packagename
```
卸载一个已安装的软件包(保留配置文件):
```
apt-get remove packagename
```
卸载一个已安装的软件包(删除配置文件):
```
apt-get purge remove packagename
```
会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件:
```
apt-get autoclean apt
```
这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的:
```
apt-get clean
```
更新所有已安装的软件包:
```
apt-get upgrade
```
将系统升级到新版本:
```
apt-get dist-upgrade
```
定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式您可以释放大量的磁盘空间。如果您的需求十分迫切可以使用`apt-get clean`以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试:
```bash
apt-get dist-upgrade # 将系统升级到新版本
```
# 卸载软件包,清除残余的配置文件
apt-get remove --purge -y
apt-get autoremove --purge -y
sudo apt-get clean
apt-get autoclean
```
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
apt-get autoremove # 要删除作为依赖项安装但不再具有父应用程序的软件包
dpkg --purge --force-remove-essential kernel-image-NNN # 删除旧内核
dpkg --get-selections | grep PACKAGE_NAME | awk '{ print $1}'| xargs apt-get -y --purge autoremove # 删除专用软件包
```

@ -9,150 +9,30 @@
## 选项
```markdown
-b<区块大小>:指定磁盘的区块大小,单位为字节;
-o<输出文件>:将检查的结果写入指定的输出文件;
-s在检查时显示进度
-v执行时显示详细的信息
-w在检查时执行写入测试。
OPTIONS
-b block-size
Specify the size of blocks in bytes. The default is 1024.
-c number of blocks
is the number of blocks which are tested at a time. The default is 64.
-e max bad block count
Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the
end of the test range is reached.
-d read delay factor
This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the
read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In
other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by
twice the amount.
-f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can
cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden
using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer
tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device
really isn't mounted.
-i input_file
-e max bad block count
Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the
end of the test range is reached.
-d read delay factor
This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the
read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In
other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by
twice the amount.
-f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can
cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden
using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer
tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device
really isn't mounted.
-i input_file
Read a list of already existing known bad blocks. Badblocks will skip testing these blocks since they are known to be bad. If
input_file is specified as "-", the list will be read from the standard input. Blocks listed in this list will be omitted from
the list of new bad blocks produced on the standard output or in the output file. The -b option of dumpe2fs(8) can be used to
retrieve the list of blocks currently marked bad on an existing filesystem, in a format suitable for use with this option.
-n Use non-destructive read-write mode. By default only a non-destructive read-only test is done. This option must not be com
bined with the -w option, as they are mutually exclusive.
-o output_file
Write the list of bad blocks to the specified file. Without this option, badblocks displays the list on its standard output.
The format of this file is suitable for use by the -l option in e2fsck(8) or mke2fs(8).
-p num_passes
Repeat scanning the disk until there are no new blocks discovered in num_passes consecutive scans of the disk. Default is 0,
meaning badblocks will exit after the first pass.
-s Show the progress of the scan by writing out rough percentage completion of the current badblocks pass over the disk. Note
that badblocks may do multiple test passes over the disk, in particular if the -p or -w option is requested by the user.
-t test_pattern
Specify a test pattern to be read (and written) to disk blocks. The test_pattern may either be a numeric value between 0 and
ULONG_MAX-1 inclusive, or the word "random", which specifies that the block should be filled with a random bit pattern. For
read/write (-w) and non-destructive (-n) modes, one or more test patterns may be specified by specifying the -t option for each
test pattern desired. For read-only mode only a single pattern may be specified and it may not be "random". Read-only testing
with a pattern assumes that the specified pattern has previously been written to the disk - if not, large numbers of blocks
will fail verification. If multiple patterns are specified then all blocks will be tested with one pattern before proceeding
to the next pattern.
-v Verbose mode. Will write the number of read errors, write errors and data- corruptions to stderr.
-w Use write-mode test. With this option, badblocks scans for bad blocks by writing some patterns (0xaa, 0x55, 0xff, 0x00) on
every block of the device, reading every block and comparing the contents. This option may not be combined with the -n option,
as they are mutually exclusive.
-B Use buffered I/O and do not use Direct I/O, even if it is available.
-X Internal flag only to be used by e2fsck(8) and mke2fs(8). It bypasses the exclusive mode in-use device safety check.
```
### 参数
* 磁盘装置:指定要检查的磁盘装置;
* 磁盘区块数:指定磁盘装置的区块总数;
* 启始区块:指定要从哪个区块开始检查。
### 实例
badblocks以4096的一个block每一个block检查16次将结果输出到“hda-badblocks-list”文件里。
```
-b block-size 指定磁盘的区块大小,默认是bytes为单位大小为1024
-c number of blocks is the number of blocks which are tested at a time. The default is 64
-e max bad block count 在中止测试之前指定最大数量的坏块。 默认值为0表示测试将持续到达测试范围结束
-d read delay factor 如果读取操作中没有遇到错误,则此参数(如果已传递且非零)将导致坏块在读取之间休眠; 延迟将计算
为执行读取操作所用时间的百分比。 换句话说值100将导致每次读取延迟前一次读取所花费的数量并且
值为200的两倍量
-f
-i input_file
-e max bad block count 在中止测试之前指定最大数量的坏块。 默认值为0表示测试将持续到达测试范围结束
-o output_file 将检查的结果写入指定的输出文件
-p num_passes
-s 在检查时显示进度
# 参数
* 磁盘装置:指定要检查的磁盘装置
* 磁盘区块数:指定磁盘装置的区块总数
* 启始区块:指定要从哪个区块开始检查
```
## 实例
```bash
# badblocks以4096的一个block每一个block检查16次将结果输出到hda-badblocks-list文件里
badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
```
hda-badblocks-list是个文本文件内容如下
```
cat hda-badblocks-list
51249
51250
51251
51253
51254
……
61245
……
```
可以针对可疑的区块多做几次操作。下面badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中由第51000 block开始到63000 block结束。
```
badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000
```
这次花费的时间比较短硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同其输出的结果也不完全是相同的。重复几次同样的操作因条件多少都有些不同所以结果也有所不同。进行多次操作后直到产生最后的hda-badblock-list.final文件。
### 其他
**1、fsck使用badblocks的信息**
badblocks只会在日志文件中标记出坏道的信息但若希望在检测磁盘时也能跳过这些坏块不检测可以使用fsck的-l参数
```
fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1
```
**2、在创建文件系统前检测坏道**
badblocks可以随e2fsck和mke2fs的-c删除一起运行对ext3文件系统也一样在创建文件系统前就先检测坏道信息
```
mkfs.ext3 -c /dev/hda1
```
代码表示使用-c在创建文件系统前检查坏道的硬盘。
这个操作已经很清楚地告知我们可以采用`mkfs.ext3 -c`选项用`read-only`方式检查硬盘。这个命令会在格式化硬盘时检查硬盘并标出错误的硬盘“block”。用这个方法格式化硬盘需要有相当大的耐心因为命令运行后会一个个用读的方式检查硬盘。

@ -2,91 +2,56 @@
## 说明
在Linux下可以使用 **blkid命令** 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备包括交换分区所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。
在Linux下可以使用 **blkid命令** 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备包括交换分区所使用的文件系统类型、
LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包
### 语法
## info
```
blkid -L | -U
blkid [-c ] [-ghlLv] [-o] [-s ][-t ] -[w ] [ ...]
blkid -p [-s ] [-O ] [-S ][-o] ...
blkid -i [-s ] [-o] ...
```
```markdown
用法:
blkid -L <label> | -U <uuid>
blkid [-c <file>] [-ghlLv] [-o <format>] [-s <tag>]
[-t <token>] [<dev>]
blkid -p [-s <tag>] [-O <offset>] [-S <size>]
[-o <format>] <dev>
```
-c <file> 指定cache文件(default: /etc/blkid.tab, /dev/null = none)
blkid -i [-s <tag>] [-o <format>] <dev>
选项:
-c <file> read from <file> instead of reading from the default cache file (-c /dev/null means no cache)
-d don't encode non-printing characters
-h 显示帮助信息
-h print this usage message and exit
-g garbage collect the blkid cache
-o <format> 指定输出格式
-o <format> output format; can be one of:value, device, export or full; (default: full)
-k list all known filesystems/RAIDs and exit
-s <tag> 显示指定信息,默认显示所有信息
-s <tag> show specified tag(s) (default show all tags)
-t <token> find device with a specific token (NAME=value pair)
-l look up only first device with token specified by -t
-L <label> convert LABEL to device name
-U <uuid> convert UUID to device name
-v 显示版本信息
-w <file> write cache to different file (/dev/null = no write)
-V print version and exit
<dev> specify device(s) to probe (default: all devices)
Low-level probing options:
-p low-level superblocks probing (bypass cache)
-i gather information about I/O limits
-S <size> overwrite device size
-O <offset> probe at the given offset
-u <list> filter by "usage" (e.g. -u filesystem,raid)
-n <list> filter by filesystem type (e.g. -n vfat,ext3)
```
### 实例
1、列出当前系统中所有已挂载文件系统的类型
```
sudo blkid
```
2、显示指定设备 UUID
```
sudo blkid -s UUID /dev/sda5
```
3、显示所有设备 UUID
```
sudo blkid -s UUID
```
4、显示指定设备 LABEL
```
sudo blkid -s LABEL /dev/sda5
```
5、显示所有设备 LABEL
```
sudo blkid -s LABEL
```
6、显示所有设备文件系统
Low-level probing options:
-p low-level superblocks probing (bypass cache)
-i gather information about I/O limits
-S <size> overwrite device size
-O <offset> probe at the given offset
-u <list> filter by "usage" (e.g. -u filesystem,raid)
-n <list> filter by filesystem type (e.g. -n vfat,ext3)
```
sudo blkid -s TYPE
```
7、显示所有设备
```
sudo blkid -o device
```
## 实例
8、以列表方式查看详细信息
```bash
blkid # 列出当前系统中所有已挂载文件系统的类型
blkid -s UUID /dev/sda1 # 显示指定设备 UUID
blkid -s LABEL /dev/sda5 # 显示指定设备label
blkid -s TYPE # 显示设备文件系统
blkid -o device # 显示所有设备
blkid -o list # 以列表方式查看所有设备的相信信息
```
sudo blkid -o list
```

@ -1,52 +1,51 @@
chgrp
===
用来变更文件或目录的所属群组
# **chgrp**
## 说明
**chgrp命令** 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中组名可以是用户组的id也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。
在UNIX系统家族里文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组设置方式采用群组名称或群组识别码皆可。
### 语法
```
chgrp [选项][组群][文件|目录]
```
**chgrp命令** 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中组名可以是用户组的id也可以是用户组的组名。
文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变
该文件的组
在UNIX系统家族里文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组设置方式采用群组名称或
群组识别码皆可
```
-R 递归式地改变指定目录及其下的所有子目录和文件的所属的组
-c或——changes效果类似“-v”参数但仅回报更改的部分
-f或--quiet或——silent不显示错误信息
-h或--no-dereference只对符号连接的文件作修改而不是该其他任何相关文件
-H如果命令行参数是一个通到目录的符号链接则遍历符号链接
-R或——recursive递归处理将指令目录下的所有文件及子目录一并处理
-L遍历每一个遇到的通到目录的符号链接
-P不遍历任何符号链接默认
-v或——verbose显示指令执行过程
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
```
## 选项
### 参数
```markdown
用法chgrp [选项]... 用户组 文件...
 chgrp [选项]... --reference=参考文件 文件...
* 组:指定新工作名称;
* 文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。
-c, --changes like verbose but report only when a change is made
-f, --silent, --quiet suppress most error messages
-v, --verbose output a diagnostic for every file processed
--dereference affect the referent of each symbolic link (this is
the default), rather than the symbolic link itself
-h, --no-dereference affect symbolic links instead of any referenced file
(useful only on systems that can change the
ownership of a symlink)
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's group rather than specifying a
GROUP value
-R, --recursive operate on files and directories recursively
### 实例
以下选项修改了在指定-R选项时遍历层次结构的方式。 如果指定了多个,则只有最后一个生效
-H if a command line argument is a symbolic link
to a directory, traverse it
-L traverse every symbolic link to a directory
encountered
-P do not traverse any symbolic links (default)
将`/usr/meng`及其子目录下的所有文件的用户组改为mengxin
示例:
chgrp staff /u 将 /u 的属组更改为"staff"。
chgrp -hR staff /u 将 /u 及其子目录下所有文件的属组更改为"staff"
```
chgrp -R mengxin /usr/meng
```
更改文件ah的组群所有者为newuser
```
[root@rhel ~]# chgrp newuser ah
```
## 实例
```bash
chgrp -R mengxin /usr/meng # 将`/usr/meng`及其子目录下的所有文件的用户组改为mengxin
chgrp newuser ah # 更改文件ah的组群所有者为newuser
```

@ -30,7 +30,7 @@ Default operation is replace, per 1003.2
## 知识扩展
Linux下的任务调度分为两类 **系统任务调度** 和 **用户任务调度**
Linux下的任务调度分为两类 **系统任务调度** 和 **用户任务调度**
**系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件这个就是
系统任务调度的配置文件
@ -66,13 +66,11 @@ crontab文件的含义用户所建立的crontab文件中每一行都代表
minute hour day month week command 顺序:分 时 日 月 周
```
其中:
* minute 表示分钟可以是从0到59之间的任何整数
* hour表示小时可以是从0到23之间的任何整数
* hour表示小时可以是从0到23之间的任何整数0表示子夜
* day表示日期可以是从1到31之间的任何整数
* month表示月份可以是从1到12之间的任何整数
* week表示星期几可以是从0到7之间的任何整数这里的0或7代表星期日
* week表示星期几可以是从0到7之间的任何整数0和7表示星期天
* command要执行的命令可以是系统命令也可以是自己编写的脚本文件
在以上各个字段中,还可以使用以下特殊字符:

@ -6,10 +6,11 @@
curl为下载工具。作为一款强力工具curl支持包括HTTP、HTTPS、ftp等众多协议还支持POST、cookies、认证、从指定偏移处下载部分
文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化curl可以祝一臂之力
## 选项
[curl官网](https://curl.haxx.se/)
## 选项
```markdown
-a/--append 上传文件时,附加到目标文件
-A/--user-agent 设置用户代理发送给服务器
-anyauth 可以使用“任何”身份验证方法
@ -107,14 +108,15 @@ curl为下载工具。作为一款强力工具curl支持包括HTTP、HTTPS、
-X/--request 指定什么命令
-y/--speed-time 放弃限速所要的时间默认为30
-Y/--speed-limit 停止传输速度的限制,速度时间
```
## 实例
```bash
**文件下载**
curl命令可以用来执行下载、发送各种HTTP请求指定HTTP头部等操作。如果系统没有curl可以使用`yum install curl`安装也可以下载安装。curl是将下载文件输出到stdout将进度信息输出到stderr不显示进度信息使用`--silent`选项。
```
curl URL --silent
```

@ -31,6 +31,7 @@ dpkg -S keyword #搜索所属的包内容
dpkg -l #列出当前已安装的包
dpkg -c package.deb #列出deb包的内容
dpkg --configure package #配置包
echo -e "$(( $(dpkg -l | wc -l) -5 ))" # 所有已安装的包总数
```

@ -189,16 +189,16 @@ Ethtool命令显示的信息来源于网卡驱动层即TCP/ip协议的链路
| :------: | :------: | :------: |
| 无 -s | get_settingsget_wol get_msglevel get_link set_settings set_wol set_msglevel | 从网卡寄存器中获得网卡速度等信息,可配置 |
| -a -A | get_pauseparam set_pauseparam | 从网卡寄存器中获得Autonegotiate/RX/TX模块的状态on oroff可配置 |
| -c -C | get_coalesceset_coalesce | 从网卡寄存器中获得coalescing参数TX/RX一个数据包后推迟发生TX/RX中断的时间(us)/数据包个数—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时RX中断停止。 当tx-usecs&tx-frames同时被设为0时TX中断停止 |
| -c -C | get_coalesceset_coalesce | 从网卡寄存器中获得coalescing参数TX/RX一个数据包后推迟发生TX/RX中断的时间(us)/数据包个数<br>—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时RX中断停止。 当tx-usecs&tx-frames同时被设为0时TX中断停止 |
| -g -G | get_ringparam set_ringparam | 除当前TX/RX ring的值从网卡寄存器中读取得到可配置其它为网卡bnx2自己固定的信息 |
| -k -K | get_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso | 显示信息从保存该状态的变量中读取得到没有对应的寄存器。因此TX/RX校验等模块一直处于on状态实际上是无法修改的 |
| -i | get_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len] | 网卡bnx2自己固定的信息 —– driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0 —— |
| -k -K | get_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso | 显示信息从保存该状态的变量中读取<br>得到没有对应的寄存器。因此TX/RX校验等模块一直处于on状态实际上是无法修改的 |
| -i | get_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len] | 网卡bnx2自己固定的信息<br>—– driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0 —— |
| -d | get_drvinfoget_regs | 不支持即bnx2中没有实现函数get_regs |
| -e -E | get_eepromset_eeprom | 不支持即bnx2中没有实现函数get_eeprom |
| -r | nway_reset | 配置网卡MII_BMCR寄存器重启Auto negotiation模块 |
| -p | phys_id | 配置网卡BNX2_EMAC_LED寄存器实现LED闪功能 |
| -t | self_test | 通过配置网卡寄存器逐一测试网卡的硬件模块registersmemoryloopbackLink statinterrupt |
| -S | get_ethtool_stats | 显示信息来源于网卡驱动中的结构体变量stats_blk。网卡通过DMA方式将寄存器BNX2_HC_STATISTICS _ADDR_L和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。 —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册 |
| -S | get_ethtool_stats | 显示信息来源于网卡驱动中的结构体变量stats_blk。网卡通过DMA方式将寄存器BNX2_HC_STATISTICS_ADDR_L<br>和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。 —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册 |
由上可见ethtool命令用于显示/配置网卡硬件(寄存器)

@ -26,6 +26,11 @@ fdisk -s <分区> 给出分区大小(块数)
## 实例
```bash
e2fsck -f -y -v -C 0 '/dev/sdb2'
resize2fs -p '/dev/sdb2' 15171584k
mkfs.ext4 -F -O ^64bit -L 'data' '/dev/sdb3'
# 新建分区及目录详细步骤:
: << comment
首先选择要进行操作的磁盘:

@ -207,7 +207,7 @@ find . -type f 时间戳,UNIX/Linux文件系统每个文件都有三种时间戳
comment
find . -type f -atime -7 # 搜索最近七天内被访问过的所有文件
find . -type f -atime 7 # 搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7 # 搜索恰好在七天前被访问过的文件
find . -type f -atime +7 # 搜索超过七天被访问过的所有文件
find . -type f -mtime -5 # 查找更改时间在5天以内的文件
find . -type f -ctime -1 # 查找在24小时内状态改变的文件

@ -1,167 +1,27 @@
gdb
===
功能强大的程序调试器
# gdb
## 说明
**gdb命令** 包含在GNU的gcc开发套件中是功能强大的程序调试器。GDB中的命令固然很多但我们只需掌握其中十个左右的命令就大致可以完成日常的基本的程序调试工作。
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th>命令</th>
<th>解释</th>
<th>示例</th>
</tr>
<tr>
<td>file <文件名></td>
<td>加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB因而文本名不需要带路径。</td>
<td>(gdb) file gdb-sample</td>
</tr>
<tr>
<td>r</td>
<td>Run的简写运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。</td>
<td>(gdb) r</td>
</tr>
<tr>
<td>c</td>
<td>Continue的简写继续执行被调试程序直至下一个断点或程序结束。</td>
<td>(gdb) c</td>
</tr>
<tr>
<td>b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址> d [编号]</td>
<td>b: Breakpoint的简写设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编可以不予理会此用法。 d: Delete breakpoint的简写删除指定编号的某个断点或删除所有断点。断点编号从1开始递增。</td>
<td>(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c (gdb) d</td>
</tr>
<tr>
<td>s, n</td>
<td>s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。 s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。 这两个命令必须在有源代码调试信息的情况下才可以使用GCC编译时使用“-g”参数</td>
<td>(gdb) s
(gdb) n</td>
</tr>
<tr>
<td>si, ni</td>
<td>si命令类似于s命令ni命令类似于n命令。所不同的是这两个命令si/ni所针对的是汇编指令而s/n针对的是源代码。</td>
<td>(gdb) si
(gdb) ni</td>
</tr>
<tr>
<td>p <变量名称></td>
<td>Print的简写显示指定变量临时变量或全局变量的值。</td>
<td>(gdb) p i
(gdb) p nGlobalVar</td>
</tr>
<tr>
<td>display ... undisplay <编号></td>
<td>display设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。 undispaly取消先前的display设置编号从1开始递增。</td>
<td>(gdb) display /i $pc (gdb) undisplay 1</td>
</tr>
<tr>
<td>i</td>
<td>info的简写用于显示各类信息详情请查阅“help i”。</td>
<td>(gdb) i r</td>
</tr>
<tr>
<td>q</td>
<td>Quit的简写退出GDB调试环境。</td>
<td>(gdb) q</td>
</tr>
<tr>
<td>help [命令名称]</td>
<td>GDB帮助命令提供对GDB名种命令的解释说明。
如果指定了“命令名称”参数则显示该命令的详细说明如果没有指定参数则分类显示所有GDB命令供用户进一步浏览和查询。</td>
<td>(gdb) help</td>
</tr>
</tbody>
</table>
### 语法
```
gdb(选项)(参数)
```
```
**gdb命令** 包含在GNU的gcc开发套件中是功能强大的程序调试器。GDB中的命令固然很多但我们只需掌握其中十个左右的命令
就大致可以完成日常的基本的程序调试工作
| 命令 | 解释 |
| :------: | :------: |
| file <文件名> | 加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB因而文本名不需要带路径 |
| r | Run的简写运行被调试的程序。 如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处 |
| c | Continue的简写继续执行被调试程序直至下一个断点或程序结束 |
| b <行号> b <函数名称> b *<函数名称> b *<代码地址> d [编号] | b: Breakpoint的简写设置断点。两可以使用“行号”<br>“函数名称”“执行地址”等方式指定断点位置。 其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog<br>代码处”。如果不了解汇编,可以不予理会此用法。 d: Delete breakpoint的简写<br>删除指定编号的某个断点或删除所有断点。断点编号从1开始递增 |
| s, n | s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数; n: 执行一行源程序代码,此行代码中的函数<br>调用也一并执行。 s 相当于其它调试器中的“Step Into (单步跟踪进入)”; n 相当于其它调试器中的“Step Over (单步跟踪)<br>这两个命令必须在有源代码调试信息的情况下才可以使用GCC编译时使用“-g”参数 |
| si, ni | si命令类似于s命令ni命令类似于n命令。所不同的是这两个命令si/ni所针对的是汇编指令而s/n针对的是源代码 |
| p <变量名称> | Print的简写显示指定变量临时变量或全局变量的值 |
| display ... undisplay <编号> | display设置程序中断后欲显示的数据及其格式。 例如,如果希望每次程序中断后可以看到<br>即将被执行的下一条汇编指令,可以使用命令 “display /i $pc” 其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要<br>关心汇编代码时,此命令相当有用。 undispaly取消先前的display设置编号从1开始递增 |
| i | info的简写用于显示各类信息详情请查阅“help i” |
| q | Quit的简写退出GDB调试环境 |
| help [命令名称] | GDB帮助命令提供对GDB名种命令的解释说明。 如果指定了“命令名称”参数,则显示该命令的详细说明;<br>如果没有指定参数则分类显示所有GDB命令供用户进一步浏览和查询 |
## 选项
```markdown
-cd设置工作目录
-q安静模式不打印介绍信息和版本信息
-d添加文件查找路径
@ -169,292 +29,11 @@ gdb(选项)(参数)
-s设置读取的符号表文件。
```
### 参数
文件:二进制可执行程序。
### 实例
以下是linux下dgb调试的一个实例先给出一个示例用的小程序C语言代码
```
#include <stdio.h>
int nGlobalVar = 0;
int tempFunction(int a, int b)
{
printf("tempFunction is called, a = %d, b = %d /n", a, b);
return (a + b);
}
int main()
{
int n;
n = 1;
n++;
n--;
nGlobalVar += 100;
nGlobalVar -= 12;
printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);
n = tempFunction(1, 2);
printf("n = %d", n);
return 0;
}
```
请将此代码复制出来并保存到文件 gdb-sample.c 中然后切换到此文件所在目录用GCC编译之
```
gcc gdb-sample.c -o gdb-sample -g
```
## 实例
在上面的命令行中,使用 -o 参数指定了编译生成的可执行文件名为 gdb-sample使用参数 -g 表示将源代码信息编译到可执行文件中。如果不使用参数 -g会给后面的GDB调试造成不便。当然如果我们没有程序的源代码自然也无从使用 -g 参数,调试/跟踪时也只能是汇编代码级别的调试/跟踪。
```bash
g++ -g hello.cpp -o hello # 对C/C++程序的调试,需要在编译前就加上-g选项
gdb hello # 调试可执行文件hello
下面“gdb”命令启动GDB将首先显示GDB说明不管它
```
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
(gdb)
```
上面最后一行“(gdb)”为GDB内部命令引导符等待用户输入GDB命令。
下面使用“file”命令载入被调试程序 gdb-sample这里的 gdb-sample 即前面 GCC 编译输出的可执行文件):
```
(gdb) file gdb-sample
Reading symbols from gdb-sample...done.
```
上面最后一行提示已经加载成功。
下面使用“r”命令执行Run被调试文件因为尚未设置任何断点将直接执行到程序结束
```
(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample
n = 1, nGlobalVar = 88
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.
```
下面使用“b”命令在 main 函数开头设置一个断点Breakpoint
```
(gdb) b main
Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19.
```
上面最后一行提示已经成功设置断点,并给出了该断点信息:在源文件 gdb-sample.c 第19行处设置断点这是本程序的第一个断点序号为1断点处的代码地址为 0x804835c此值可能仅在本次调试过程中有效。回过头去看源代码第19行中的代码为“n = 1”恰好是 main 函数中的第一个可执行语句前面的“int n;”为变量定义语句,并非可执行语句)。
再次使用“r”命令执行Run被调试程序
```
(gdb) r
Starting program: /home/liigo/temp/gdb-sample
Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;
```
程序中断在gdb-sample.c第19行处即main函数是第一个可执行语句处。
上面最后一行信息为下一条将要执行的源代码为“n = 1;”它是源代码文件gdb-sample.c中的第19行。
下面使用“s”命令Step执行下一行代码即第19行“n = 1;”):
```
(gdb) s
20 n++;
```
上面的信息表示已经执行完“n = 1;”并显示下一条要执行的代码为第20行的“n++;”。
既然已经执行了“n = 1;”,即给变量 n 赋值为 1那我们用“p”命令Print看一下变量 n 的值是不是 1
```
(gdb) p n
$1 = 1
```
果然是 1。$1大致是表示这是第一次使用“p”命令——再次执行“p n”将显示“$2 = 1”——此信息应该没有什么用处。
下面我们分别在第26行、tempFunction 函数开头各设置一个断点分别使用命令“b 26”“b tempFunction”
```
(gdb) b 26
Breakpoint 2 at 0x804837b: file gdb-sample.c, line 26.
(gdb) b tempFunction
Breakpoint 3 at 0x804832e: file gdb-sample.c, line 12.
```
使用“c”命令继续Continue执行被调试程序程序将中断在第二 个断点26行此时全局变量 nGlobalVar 的值应该是 88再一次执行“c”命令程序将中断于第三个断点12行tempFunction 函数开头处此时tempFunction 函数的两个参数 a、b 的值应分别是 1 和 2
```
(gdb) c
Continuing.
Breakpoint 2, main () at gdb-sample.c:26
26 printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);
(gdb) p nGlobalVar
$2 = 88
(gdb) c
Continuing.
n = 1, nGlobalVar = 88
Breakpoint 3, tempFunction (a=1, b=2) at gdb-sample.c:12
12 printf("tempFunction is called, a = %d, b = %d /n", a, b);
(gdb) p a
$3 = 1
(gdb) p b
$4 = 2
```
上面反馈的信息一切都在我们预料之中~~
再一次执行“c”命令Continue因为后面再也没有其它断点程序将一直执行到结束
```
(gdb) c
Continuing.
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.
```
有时候需要看到编译器生成的汇编代码,以进行汇编级的调试或跟踪,又该如何操作呢?
这就要用到display命令“display /i $pc”了此命令前面已有详细解释
```
(gdb) display /i $pc
(gdb)
```
此后程序再中断时,就可以显示出汇编代码了:
```
(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample
Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)
```
看到了汇编代码“n = 1;”对应的汇编代码是“movl $0x1,0xfffffffc(%ebp)”。
并且以后程序每次中断都将显示下一条汇编指定“si”命令用于执行一条汇编代码——区别于“s”执行一行C代码
```
(gdb) si
20 n++;
1: x/i $pc 0x8048363 <main+23>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x08048366 20 n++;
1: x/i $pc 0x8048366 <main+26>: incl (%eax)
(gdb) si
21 n--;
1: x/i $pc 0x8048368 <main+28>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x0804836b 21 n--;
1: x/i $pc 0x804836b <main+31>: decl (%eax)
(gdb) si
23 nGlobalVar += 100;
1: x/i $pc 0x804836d <main+33>: addl $0x64,0x80494fc
```
接下来我们试一下命令“b *<函数名称>”。
为了更简明有必要先删除目前所有断点使用“d”命令——Delete breakpoint
```
(gdb) d
Delete all breakpoints? (y or n) y
(gdb)
```
当被询问是否删除所有断点时输入“y”并按回车键即可。
下面使用命令“b *main”在 main 函数的 prolog 代码处设置断点prolog、epilog分别表示编译器在每个函数的开头和结尾自行插入的代码
```
(gdb) b *main
Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17.
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample
Breakpoint 4, main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834c <main>: push %ebp
(gdb) si
0x0804834d 17 {
1: x/i $pc 0x804834d <main+1>: mov %esp,%ebp
(gdb) si
0x0804834f in main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834f <main+3>: sub $0x8,%esp
(gdb) si
0x08048352 17 {
1: x/i $pc 0x8048352 <main+6>: and $0xfffffff0,%esp
(gdb) si
0x08048355 17 {
1: x/i $pc 0x8048355 <main+9>: mov $0x0,%eax
(gdb) si
0x0804835a 17 {
1: x/i $pc 0x804835a <main+14>: sub %eax,%esp
(gdb) si
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)
```
此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Infomation Register”
```
(gdb) i r
eax 0xbffff6a4 -1073744220
ecx 0x42015554 1107383636
edx 0x40016bc8 1073834952
ebx 0x42130a14 1108544020
esp 0xbffff6a0 0xbffff6a0
ebp 0xbffff6a8 0xbffff6a8
esi 0x40015360 1073828704
edi 0x80483f0 134513648
eip 0x8048366 0x8048366
eflags 0x386 902
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x33 51
```
当然也可以显示任意一个指定的寄存器值:
```
(gdb) i r eax
eax 0xbffff6a4 -1073744220
```
最后一个要介绍的命令是“q”退出QuitGDB调试环境
```
(gdb) q
The program is running. exit anyway? (y or n)
```

@ -1,61 +1,41 @@
gpasswd
===
Linux下工作组文件的管理工具
# **gpasswd**
## 说明
**gpasswd命令** 是Linux下工作组文件`/etc/group`和`/etc/gshadow`管理工具。
### 语法
```
gpasswd(选项)(参数)
```
```
-a添加用户到组
-d从组删除用户
-A指定管理员
-M指定组成员和-A的用途差不多
-r删除密码
-R限制用户登入组只有组中的成员才可以用newgrp加入该组。
```
### 参数
**gpasswd命令** 是Linux下工作组文件`/etc/group`和`/etc/gshadow`管理工具
组:指定要管理的工作组。
## 选项
### 实例
```markdown
用法gpasswd [选项] 组
如系统有个peter账户该账户本身不是groupname群组的成员使用newgrp需要输入密码即可。
-a, --add USER 向组 GROUP 中添加用户 USER
-d, --delete USER 从组 GROUP 中添加或删除用户
-Q, --root CHROOT_DIR 要 chroot 进的目录
-r, --delete-password remove the GROUP's password
-R, --restrict 向其成员限制访问组 GROUP
-M, --members USER,... 设置组 GROUP 的成员列表
-A, --administrators ADMIN,... 设置组的管理员列表
除非使用 -A 或 -M 选项,不能结合使用这些选项
```
gpasswd groupname
```
让使用者暂时加入成为该组成员之后peter建立的文件group也会是groupname。所以该方式可以暂时让peter建立文件时使用其他的组而不是peter本身所在的组。
所以使用`gpasswd groupname`设定密码就是让知道该群组密码的人可以暂时切换具备groupname群组功能的。
## 实例
```
gpasswd -A peter users
```
这样peter就是users群组的管理员就可以执行下面的操作:
```bash
gpasswd groupname # 如系统有个peter账户该账户本身不是groupname群组的成员使用newgrp需要输入密码即可。
```
gpasswd -a mary users
gpasswd -a allen users
```
: << comment
让使用者暂时成为该组成员之后peter用户创建的文件组名也会是groupname。所以该方式可暂时让peter建立文件时使用其他的组
而不是peter本身所在的组。所以使用`gpasswd groupname`设定密码就是让知道该群组密码的人可以暂时切换具备groupname群组功能的。
comment
gpasswd -A peter users # 此处peter就是users群组的管理员
: << comment
注意:添加用户到某一个组 可以使用`usermod -G group_name user_name`这个命令可以添加一个用户到指定的组,但是以前添加的组就会清空掉。
所以想要添加一个用户到一个组同时保留以前添加的组时请使用gpasswd这个命令来添加操作用户
```
所以想要添加一个用户到一个组同时保留以前添加的组时请使用gpasswd这个命令来添加操作用户
comment
gpasswd -a user_name group_name
```

@ -1,26 +1,22 @@
groupdel
===
用于删除指定的工作组
# groupdel
## 说明
**groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户则必须先删除这些用户后方能删除群组。
**groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。
若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组
### 语法
```
groupdel(参数)
```
## 选项
### 参数
```markdown
用法groupdel [选项] 组
组:要删除的工作组名。
-R, --root CHROOT_DIR chroot到的目录
```
### 实例
## 实例
```
groupadd damon //创建damon工作组
groupdel damon //删除这个工作组
```bash
groupdel damon # 删除damon工作组
```

@ -1,32 +1,30 @@
groupmod
===
更改群组识别码或名称
# **groupmod**
## 说明
**groupmod命令** 更改群组识别码或名称。需要更改群组的识别码或名称时可用groupmod指令来完成这项工作。
### 语法
```
groupmod(选项)(参数)
```
**groupmod命令** 更改群组识别码或名称。需要更改群组的识别码或名称时可用groupmod指令来完成这项工作
## 选项
```markdown
用法groupmod [选项] 组
```
-g, --gid GID 将组 ID 改为 GID
-h, --help 显示此帮助信息并推出
-n, --new-name NEW_GROUP 改名为 NEW_GROUP
-o, --non-unique 允许使用重复的 GID
-p, --password PASSWORD 将密码更改为(加密过的) PASSWORD
-p, --password PASSWORD 将密码更改为(加密过的)PASSWORD
-R, --root CHROOT_DIR chroot 到的目录
```
### 参数
## 实例
组名:指定要修改的工作的组名。
```bash
groupmod -n cisco web # 将组名web改成cisco
groupmod -g 9999 web # 创建web组的同时指定gid为9999
```

@ -1,77 +1,33 @@
id
===
显示用户的ID以及所属群组的ID
# **id**
## 说明
**id命令** 可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组IDGID则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。
当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在`/etc/group`文件中搜寻。如往常一样,你可以在控制台输入`man id`进入id的手册页来获取更多的详情。
### 语法
```
id [-gGnru]--[help][--version][用户名称]
```
**id命令** 可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组IDGID则对应多个UID。id命令已经默认预装
在大多数Linux系统中。要使用它只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户
当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在
`/etc/group`文件中搜寻。如往常一样,你可以在控制台输入`man id`进入id的手册页来获取更多的详情
```
-g或--group   显示用户所属群组的ID。
-G或--groups 显示用户所属附加群组的ID。
-n或--name   显示用户,所属群组或附加群组的名称。
-r或--real   显示实际ID。
-u或--user   显示用户ID。
-help   显示帮助。
-version   显示版本信息。
```
## 选项
### 实例
```markdown
-a ignore, for compatibility with other versions
-Z, --context print only the security context of the current user
-g, --group 仅打印有效的组ID
-G, --groups print all group IDs
-n, --name print a name instead of a number, for -ugG
-r, --real print the real ID instead of the effective ID, with -ugG
-u, --user print only the effective user ID
-z, --zero delimit entries with NUL characters, not whitespace;not permitted in default format
```
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
如果不附带任何选项,程序会显示一些可供识别用户身份的有用信息
```
解释用户root的UID号码 = 0GID号码 = 0。用户root是下面组的成员
## 实例
* root组GID号是0
* bin组GID号是1
* daemon组GID号是2
* sys组GID号是3
* adm组GID号是4
* disk组GID号是6
* wheel组GID号是10
打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用 -a 选项:
```
[root@localhost ~]# id -a
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
```
输出所有不同的组ID ,有效的,真实的和补充的,我们可以使用 -G 选项来实现:
```
[root@localhost ~]# id -G
0 1 2 3 4 6 10
```
结果只会显示GID号。你可以和`/etc/group`文件比较。下面是`/etc/group`文件的示例内容:
只输出有效的组ID通过使用 -g 选项来只输出有效组ID
```
[root@localhost ~]# id -g
0
```
输出特定用户信息我们可以输出特定的用户信息相关的UID和GID。只需要在id命令后跟上用户名
```bash
id
```
[root@localhost ~]# id www
uid=500(www) gid=500(www) groups=500(www)
```

@ -3,7 +3,8 @@
## 说明
**iostat命令** 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况同时也会汇报出CPU使用情况
同vmstat一样iostat也有一个弱点就是它不能对某个进程进行深入分析仅对系统的整体情况进行分析
同vmstat一样iostat也有一个弱点就是它不能对某个进程进行深入分析仅对系统的整体情况进行分析。
[源码](http://github.com/sysstat/sysstat)
## 选项
@ -19,13 +20,17 @@
* 间隔时间:每次报告的间隔时间(秒)
* 次数:显示报告的次数
配置文件目录:/etc/sysconfig
```
## 实例
```bash
iostat -x /dev/sda1 # 查看磁盘sda1的I/O详细情况
iostat -d -x -k 1 1
iostat -d -k 1 1 # 查看TPS(该设备每秒的传输次数)和吞吐量
iostat -d -x -k 1 1 # 查看设备使用率(%util和响应时间await
: << comment
输出说明:
%iowait的值过高表示硬盘存在I/O瓶颈。
@ -38,7 +43,8 @@ idble小于70%I/O负荷过大进程读取有过多的等待用vmstat查
comment
```
详细说明第二行是系统信息和监测时间第三行和第四行显示CPU使用情况具体内容和mpstat命令相同。这里主要关注后面I/O输出的信息如下所示
详细说明第二行是系统信息和监测时间第三行和第四行显示CPU使用情况具体内容和mpstat命令相同。这里主要关注后面I/O
输出的信息,如下所示:
| 标示 | 说明 |
| :------: | :------: |

@ -1,350 +1,139 @@
iperf
===
网络性能测试工具
# **iperf**
## 说明
**iperf命令** 是一个网络性能测试工具。iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽具有多种参数和UDP特性。iperf可以报告带宽延迟抖动和数据包丢失。利用iperf这一特性可以用来测试一些网络设备如路由器防火墙交换机等的性能。
iperf分为两种版本Unix/Linux版和Windows版Unix/Linux版更新比较快版本最新。Windows版更新慢。Windows版的iperf叫jperf或者xjperf。jperf是在iperf基础上开发了更好的UI和新的功能。
Linux版本下载地址http://code.google.com/p/iperf/downloads/list
### 安装iperf
对于windows版的iperf直接将解压出来的iperf.exe和cygwin1.dll复制到%systemroot%目录即可对于linux版的iperf请使用如下命令安装
```
gunzip -c iperf-<version>.tar.gz | tar -xvf -
cd iperf-<version>
./configure
make
make install
```
<table>
<tbody>
<tr>
<th>命令行选项</th>
<th>描述</th>
</tr>
<tr>
<td>客户端与服务器共用选项</td>
</tr>
<tr>
<td>-f, --format [bkmaBKMA]</td>
<td>格式化带宽数输出。支持的格式有:
'b' = bits/sec 'B' = Bytes/sec
'k' = Kbits/sec 'K' = KBytes/sec
'm' = Mbits/sec 'M' = MBytes/sec
'g' = Gbits/sec 'G' = GBytes/sec
'a' = adaptive bits/sec 'A' = adaptive Bytes/sec
自适应格式是kilo-和mega-二者之一。除了带宽之外的字段都输出为字节除非指定输出的格式默认的参数是a。
注意在计算字节byte时Kilo = 1024 Mega = 1024^2Giga = 1024^3。通常在网络中Kilo = 1000 Mega = 1000^2 and Giga = 1000^3所以Iperf也按此来计算比特。如果这些困扰了你那么请使用-f b参数然后亲自计算一下。</td>
</tr>
<tr>
<td>-i, --interval #</td>
<td>设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。</td>
</tr>
<tr>
<td>-l, --len #[KM]</td>
<td>设置读写缓冲区的长度。TCP方式默认为8KBUDP方式默认为1470字节。</td>
</tr>
<tr>
<td>-m, --print_mss</td>
<td>输出TCP MSS值通过TCP_MAXSEG支持。MSS值一般比MTU值小40字节。通常情况</td>
</tr>
<tr>
<td>-p, --port #</td>
<td>设置端口与服务器端的监听端口一致。默认是5001端口与ttcp的一样。</td>
</tr>
<tr>
<td>-u, --udp</td>
<td>使用UDP方式而不是TCP方式。参看-b选项。</td>
</tr>
<tr>
<td>-w, --window #[KM]</td>
<td>设置套接字缓冲区为指定大小。对于TCP方式此设置为TCP窗口大小。对于UDP方式此设置为接受UDP数据包的缓冲区大小限制可以接受数据包的最大值。</td>
</tr>
<tr>
<td>-B, --bind host</td>
<td>绑定到主机的多个地址中的一个。对于客户端来说这个参数设置了出栈接口。对于服务器端来说这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。</td>
</tr>
<tr>
<td>-C, --compatibility</td>
<td>与低版本的Iperf使用时可以使用兼容模式。不需要两端同时使用兼容模式但是强烈推荐两端同时使用兼容模式。某些情况下使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。</td>
</tr>
<tr>
<td>-M, --mss #ip头减去40字节。在以太网中MSS值 为1460字节MTU1500字节。许多操作系统不支持此选项。</td>
</tr>
<tr>
<td>-N, --nodelay</td>
<td>设置TCP无延迟选项禁用Nagle's运算法则。通常情况此选项对于交互程序例如telnet是禁用的。</td>
</tr>
<tr>
<td>-V (from v1.6 or higher)</td>
<td>绑定一个IPv6地址。
服务端:$ iperf -s V
客户端:$ iperf -c <Server IPv6 Address> -V
注意在1.6.3或更高版本中指定IPv6地址不需要使用-B参数绑定在1.6之前的版本则需要。在大多数操作系统中将响应IPv4客户端映射的IPv4地址。</td>
</tr>
<tr>
<td>服务器端专用选项</td>
</tr>
<tr>
<td>-s, --server</td>
<td>Iperf服务器模式</td>
</tr>
<tr>
<td>-D (v1.2或更高版本)</td>
<td>Unix平台下Iperf作为后台守护进程运行。在Win32平台下Iperf将作为服务运行。</td>
</tr>
<tr>
<td>-R(v1.2或更高版本仅用于Windows)</td>
<td>卸载Iperf服务如果它在运行</td>
</tr>
<tr>
<td>-o(v1.2或更高版本仅用于Windows)</td>
<td>重定向输出到指定文件</td>
</tr>
<tr>
<td>-c, --client host</td>
<td>如果Iperf运行在服务器模式并且用-c参数指定一个主机那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。</td>
</tr>
<tr>
<td>-P, --parallel #</td>
<td>服务器关闭之前保持的连接数。默认是0这意味着永远接受连接。</td>
</tr>
<tr>
<td>客户端专用选项</td>
</tr>
<tr>
<td>-b, --bandwidth #[KM]</td>
<td>UDP模式使用的带宽单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。</td>
</tr>
<tr>
<td>-c, --client host</td>
<td>运行Iperf的客户端模式连接到指定的Iperf服务器端。</td>
</tr>
<tr>
<td>-d, --dualtest</td>
<td>运行双测试模式。这将使服务器端反向连接到客户端,使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。</td>
</tr>
<tr>
<td>-n, --num #[KM]</td>
<td>传送的缓冲器数量。通常情况Iperf按照10秒钟发送数据。-n参数跨越此限制按照指定次数发送指定长度的数据而不论该操作耗费多少时间。参考-l与-t选项。</td>
</tr>
<tr>
<td>-r, --tradeoff</td>
<td>往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口或默认为客户端连接到服务器端的端口反向连接至客户端。当客户端连接终止时反向连接随即开始。如果需要同时进行双向测试请尝试-d参数。</td>
</tr>
<tr>
<td>-t, --time #</td>
<td>设置传输的总时间。Iperf在指定的时间内重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。</td>
</tr>
<tr>
<td>-L, --listenport #</td>
<td>指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。</td>
</tr>
<tr>
<td>-P, --parallel #</td>
<td>线程数。指定客户端与服务端之间使用的线程数。默认是1线程。需要客户端与服务器端同时使用此参数。</td>
</tr>
<tr>
<td>-S, --tos #</td>
<td>出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值使用以"0x"开始的16进制数或以"0"开始的8进制数或10进制数。
例如16进制'0x10' = 8进制'020' = 十进制'16'。TOS值1349就是
IPTOS_LOWDELAY minimize delay 0x10
IPTOS_THROUGHPUT maximize throughput 0x08
IPTOS_RELIABILITY maximize reliability 0x04
IPTOS_LOWCOST minimize cost 0x02</td>
</tr>
<tr>
<td>-T, --ttl #</td>
<td>出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1链接本地。</td>
</tr>
<tr>
<td>-F (from v1.2 or higher)</td>
<td>使用特定的数据流测量带宽,例如指定的文件。
$ iperf -c <server address> -F <file-name></td>
</tr>
<tr>
<td>-I (from v1.2 or higher)</td>
<td>与-F一样由标准输入输出文件输入数据。</td>
</tr>
<tr>
<td>杂项</td>
</tr>
<tr>
<td>-h, --help</td>
<td>显示命令行参考并退出 。</td>
</tr>
<tr>
<td>-v, --version</td>
<td>显示版本信息和编译信息并退出。</td>
</tr>
</tbody>
</table>
### 实例
带宽测试通常采用UDP模式因为能测出极限带宽、时延抖动、丢包率。在进行测试时首先以链路理论带宽作为数据发送速率进行测试例如从客户端到服务器之间的链路的理论带宽为100Mbps先用`-b 100M`进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。
iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽具有多种参数和UDP特性。iperf可以报告带宽延迟抖动和数据包丢失。
利用iperf这一特性可以用来测试一些网络设备如路由器防火墙交换机等的性能
* [iperf3 github](https://github.com/esnet/iperf)
* [perfsonar文档](http://docs.perfsonar.net)
* [public iperf3 server地址](https://iperf.fr)
* [internet2](http://software.internet2.edu)
## 网络吞吐量工具比较
* [iperf2](https://sourceforge.net/projects/iperf2/)
* [iperf3](https://software.es.net/iperf)
* [nuttcp](http://nuttcp.net/)
注意:三个工具都在开发阶段,此处有可能随着时间推移有所变动未及时修改
| | | 工具特征比较 | | |
| :------: | :------: | :------: | :------: | :------: |
| 版本 | iperf2.0.5 | iperf2.0.8 + | iperf3.1.5 + | nuttcp 8.x |
|  多线程 | -P | -P | | |
|  JSON输出 | | | --json | |
|  CSV输出 | -y | -y | | |
| FQ-based pacing | | | --fq-rate | |
|  多播支持 | --ttl | --ttl | | -m |
|  双向测试 | --dualtest | --dualtest | | |
| 转发和CWND报告 | | -e | 默认开启 | -br/-bc  |
| 跳过TCP慢启动 | | | --omit | |
| 设置TCP拥塞控制alg | -Z | -Z | --congestion | |
| 零拷贝(sendfile) | | | --zerocopy | |
| UDP burst模式 | | | | -Ri#/# |
| MS Windows支持 | 是 | 是 | 没有 | 没有 |
## 用途建议如下
* 将iperf2用于并行流双向或基于MS Windows的测试
* 使用nuttcp进行高速UDP测试
* 否则使用iperf3。特别是如果你想要详细的JSON输出
## iperf3常见问题
```markdown
iperf3是单线程的而iperf2是多线程的。建议将iperf2用于并行流将iperf3用于并行流参考
https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/iperf/multi-stream-iperf3/
UDP速率低于100Kbps时需要减少默认数据包长度使用-l100选项
使用-fq-rate选项时需要内核配置修改net.core.default_qdisc = fq
```
```markdown
客户端与服务器共用选项
-f, --format [bkmaBKMA] 格式化带宽数输出。支持的格式有: 'b' = bits/sec 'B' = Bytes/sec 'k' = Kbits/sec 'K' = KBytes/sec 'm' = Mbits/sec 'M' = MBytes/sec 'g' = Gbits/sec 'G' = GBytes/sec 'a' = adaptive bits/sec 'A' = adaptive Bytes/sec 自适应格式是kilo-和mega-二者之一。除了带宽之外的字段都输出为字节除非指定输出的格式默认的参数是a。 注意在计算字节byte时Kilo = 1024 Mega = 1024^2Giga = 1024^3。通常在网络中Kilo = 1000 Mega = 1000^2 and Giga = 1000^3所以Iperf也按此来计算比特。如果这些困扰了你那么请使用-f b参数然后亲自计算一下。
-i, --interval # 设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。
-l, --len #[KM] 设置读写缓冲区的长度。TCP方式默认为8KBUDP方式默认为1470字节。
-m, --print_mss 输出TCP MSS值通过TCP_MAXSEG支持。MSS值一般比MTU值小40字节。通常情况
-p, --port # 设置端口与服务器端的监听端口一致。默认是5001端口与ttcp的一样。
-u, --udp 使用UDP方式而不是TCP方式。参看-b选项。
-w, --window #[KM] 设置套接字缓冲区为指定大小。对于TCP方式此设置为TCP窗口大小。对于UDP方式此设置为接受UDP数据包的缓冲区大小限制可以接受数据包的最大值。
-B, --bind host 绑定到主机的多个地址中的一个。对于客户端来说这个参数设置了出栈接口。对于服务器端来说这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。
-C, --compatibility 与低版本的Iperf使用时可以使用兼容模式。不需要两端同时使用兼容模式但是强烈推荐两端同时使用兼容模式。某些情况下使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。
-M, --mss #ip头减去40字节。在以太网中MSS值 为1460字节MTU1500字节。许多操作系统不支持此选项。
-N, --nodelay 设置TCP无延迟选项禁用Nagle's运算法则。通常情况此选项对于交互程序例如telnet是禁用的。
-V (from v1.6 or higher) 绑定一个IPv6地址。 服务端:$ iperf -s V 客户端:$ iperf -c -V 注意在1.6.3或更高版本中指定IPv6地址不需要使用-B参数绑定在1.6之前的版本则需要。在大多数操作系统中将响应IPv4客户端映射的IPv4地址。
服务器端专用选项
-s, --server Iperf服务器模式
-D (v1.2或更高版本) Unix平台下Iperf作为后台守护进程运行。在Win32平台下Iperf将作为服务运行。
-R(v1.2或更高版本仅用于Windows) 卸载Iperf服务如果它在运行
-o(v1.2或更高版本仅用于Windows) 重定向输出到指定文件
-c, --client host 如果Iperf运行在服务器模式并且用-c参数指定一个主机那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。
-P, --parallel # 服务器关闭之前保持的连接数。默认是0这意味着永远接受连接。
客户端专用选项
-b, --bandwidth #[KM] UDP模式使用的带宽单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。
-c, --client host 运行Iperf的客户端模式连接到指定的Iperf服务器端。
-d, --dualtest 运行双测试模式。这将使服务器端反向连接到客户端,使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。
-n, --num #[KM] 传送的缓冲器数量。通常情况Iperf按照10秒钟发送数据。-n参数跨越此限制按照指定次数发送指定长度的数据而不论该操作耗费多少时间。参考-l与-t选项。
-r, --tradeoff 往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口或默认为客户端连接到服务器端的端口反向连接至客户端。当客户端连接终止时反向连接随即开始。如果需要同时进行双向测试请尝试-d参数。
-t, --time # 设置传输的总时间。Iperf在指定的时间内重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。
-L, --listenport # 指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。
-P, --parallel # 线程数。指定客户端与服务端之间使用的线程数。默认是1线程。需要客户端与服务器端同时使用此参数。
-S, --tos # 出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值使用以"0x"开始的16进制数或以"0"开始的8进制数或10进制数。 例如16进制'0x10' = 8进制'020' = 十进制'16'。TOS值1349就是 IPTOS_LOWDELAY minimize delay 0x10 IPTOS_THROUGHPUT maximize throughput 0x08 IPTOS_RELIABILITY maximize reliability 0x04 IPTOS_LOWCOST minimize cost 0x02
-T, --ttl # 出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1链接本地。
-F (from v1.2 or higher) 使用特定的数据流测量带宽,例如指定的文件。 $ iperf -c -F
-I (from v1.2 or higher) 与-F一样由标准输入输出文件输入数据。
```
## 实例
```bash
# 通过perfSONAR安装,最好设置tcp拥塞算法为net.ipv4.tcp_congestion_control = htcp
yum install -y http://software.internet2.edu/rpms/el7/x86_64/latest/packages/perfSONAR-repo-0.9-1.noarch.rpm
yum install -y perfsonar-tools # 仅包含运行按需测量所需的命令行客户端owamp twamp nuttcp iperf3 iperf
: << comment
包括perfsonar-tools包中的所有内容以及以下所需的软件
* 定期自动运行测试
* 参与集中管理的测试
* 发布测量节点的存在
comment
yum install -y perfsonar-testpoint
: << comment
perfsonar-core bundle install包括perfsonar-testpoint bundle install中的所有内容以及用于存储结果的esmond测量存档。这对于希望在
本地存储结果但不希望安装perfSONAR Toolkit的专用测量主机来说非常理想。换句话说他们不想使用Web界面并希望灵活地选择默认安全性和调整设置
comment
yum install -y perfsonar-core
: << comment
包含perfsonar-core bundle中的所有内容
用于管理测试的Web界面
脚本用于应用系统范围的默认调整和安全设置
此捆绑包适用于那些希望安装perfSONAR Toolkit ISO中包含的全套工具但在现有Linux系统上的工具包
comment
yum install -y perfsonar-toolkit
: << comment
perfsonar-centralmanagement捆绑包独立于上面的捆绑包并安装集中管理大量主机并显示其结果所需的工具。这包括esmond测量存档用于发布
任务模板的工具和用于显示结果的仪表板软件(MaDDash)
comment
yum install -y perfsonar-centralmanagement
--logfile选项。如何实时查看文件输出使用--forceflush标志。
iperf -u -s # 带宽测试通常采用UDP模式因为能测出极限带宽、时延抖动、丢包率。在进行测试时首先以链路理论带宽作为数据发送速率进行测试
# 例如从客户端到服务器之间的链路的理论带宽为100Mbps先用`-b 100M`进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以
# 实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。
**UDP模式**
服务器端:
```
iperf -u -s
```
客户端:

@ -6,19 +6,18 @@
终止该程序可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看
```markdown
-a当处理当前进程时不限制命令名和进程号的对应关系
-a当处理当前进程时不限制命令名和进程号的对应关系
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称
-L, --table List signal names in a nice table
-p指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s <信息名称或编号>:指定要送出的信息
-u指定用户
-p指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s <信息名称或编号>:指定要送出的信息
-u指定用户
```
## 实例
列出所有信号名称:
```markdown
# 列出所有信号名称
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
2) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
@ -36,11 +35,10 @@
11) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
12) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
13) SIGRTMAX-1 64) SIGRTMAX
```
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略, **下面是常用的信号:**
```markdown
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C
QUIT 3 退出(同 Ctrl + \
@ -50,7 +48,6 @@ CONT 18 继续与STOP相反 fg/bg命令
STOP 19 暂停(同 Ctrl + Z
```
```bash
```

@ -1,47 +1,14 @@
ldd
===
打印程序或者库文件所依赖的共享库列表
# ldd
## 说明
**ldd命令** 用于打印程序或者库文件所依赖的共享库列表。
### 语法
```
ldd(选项)(参数)
```
**ldd命令** 用于打印程序或者库文件所依赖的共享库列表
## 选项
```markdown
-d, --data-relocs 执行重定位和报告任何丢失的对象
-r, --function-relocs 执行数据对象和函数的重定位,并且报告任何丢失的对象和函数
-u, --unused 打印未使用的直接依赖
```
--version打印指令版本号
-v详细信息模式打印所有相关信息
-u打印未使用的直接依赖
-d执行重定位和报告任何丢失的对象
-r执行数据对象和函数的重定位并且报告任何丢失的对象和函数
--help显示帮助信息。
```
### 参数
文件:指定可执行程序或者文库。
### 其他介绍
首先ldd不是一个可执行程序而只是一个shell脚本
ldd能够显示可执行模块的dependency其原理是通过设置一系列的环境变量如下`LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE`等。当`LD_TRACE_LOADED_OBJECTS`环境变量不为空时任何可执行程序在运行时它都会只显示模块的dependency而程序并不真正执行。要不你可以在shell终端测试一下如下
```
export LD_TRACE_LOADED_OBJECTS=1
```
再执行任何的程序如ls等看看程序的运行结果。
ldd显示可执行模块的dependency的工作原理其实质是通过ld-linux.soelf动态库的装载器来实现的。我们知道ld-linux.so模块会先于executable模块程序工作并获得控制权因此当上述的那些环境变量被设置时ld-linux.so选择了显示可执行模块的dependency。
实际上可以直接执行ld-linux.so模块`/lib/ld-linux.so.2 --list program`这相当于ldd program

@ -1,98 +1,103 @@
lsblk
===
列出块设备信息
# **lsblk**
## 说明
**lsblk命令** 用于列出所有可用块设备的信息而且还能显示他们之间的依赖关系但是它不会列出RAM盘的信息。块设备有硬盘闪存盘cd-ROM等等。lsblk命令包含在util-linux-ng包中现在该包改名为util-linux。这个包带了几个其它工具如dmesg。要安装lsblk请在此处下载util-linux包。Fedora用户可以通过命令`sudo yum install util-linux-ng`来安装该包。
```
-a, --all 显示所有设备。
-b, --bytes 以bytes方式显示设备大小。
-d, --nodeps 不显示 slaves 或 holders。
-D, --discard print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs 显示文件系统信息。
-h, --help 显示帮助信息。
-i, --ascii use ascii characters only。
-m, --perms 显示权限信息。
-l, --list 使用列表格式显示。
-n, --noheadings 不显示标题。
-o, --output <list> 输出列。
-P, --pairs 使用key="value"格式显示。
-r, --raw 使用原始格式显示。
-t, --topology 显示拓扑结构信息。
```
### 实例
lsblk命令默认情况下将以树状列出所有块设备。打开终端并输入以下命令
```
lsblk
**lsblk命令** 用于列出所有可用块设备的信息而且还能显示他们之间的依赖关系但是它不会列出RAM盘的信息。块设备有硬盘闪存盘cd-ROM等等
lsblk命令包含在util-linux-ng包中现在该包改名为util-linux。这个包带了几个其它工具如dmesg。要安装lsblk请在此处下载util-linux包
Fedora用户可以通过命令`sudo yum install util-linux-ng`来安装该包
## 选项
```markdown
用法lsblk [选项] [<设备> ...]
-a, --all 打印所有设备
-b, --bytes 以字节为单位而非易读的格式来打印 SIZE
-d, --nodeps 不打印从属设备(slave)或占位设备(holder)
-D, --discard 打印时丢弃能力
-e, --exclude <列表> 根据主设备号排除设备(默认:内存盘)
-I, --include <列表> 只显示有指定主设备号的设备
-f, --fs 输出文件系统信息
-h, --help 使用信息(此信息)
-i, --ascii 只使用 ascii 字符
-m, --perms 输出权限信息
-l, --list 使用列表格式的输出
-n, --noheadings 不打印标题
-o, --output <列表> 输出列
-p, --paths 打印完整设备路径
-P, --pairs 使用 key=“value” 输出格式
-r, --raw 使用原生输出格式
-s, --inverse 反向依赖
-t, --topology 输出拓扑信息
-S, --scsi 输出有关 SCSI 设备的信息
可用列(用于 --output)
NAME 设备名
KNAME internal kernel device name
MAJ:MIN 主:次 设备号
FSTYPE 文件系统类型
MOUNTPOINT where the device is mounted
LABEL filesystem LABEL
UUID filesystem UUID
PARTLABEL 分区 LABEL
PARTUUID 分区 UUID
RA read-ahead of the device
RO 只读设备
RM removable device
MODEL device identifier
SERIAL disk serial number
SIZE size of the device
STATE 设备的状态
OWNER user name
GROUP group name
MODE device node permissions
ALIGNMENT alignment offset
MIN-IO minimum I/O size
OPT-IO optimal I/O size
PHY-SEC 物理扇区大小
LOG-SEC 逻辑扇区大小
ROTA rotational device
SCHED I/O scheduler name
RQ-SIZE request queue size
TYPE device type
DISC-ALN discard alignment offset
DISC-GRAN discard granularity
DISC-MAX discard max bytes
DISC-ZERO 忽略零数据
WSAME write same max bytes
WWN unique storage identifier
RAND adds randomness
PKNAME internal parent kernel device name
HCTL Host:Channel:Target:Lun for SCSI
TRAN device transport type
REV device revision
VENDOR device vendor
```
## 实例
```bash
lsblk # lsblk命令默认情况下将以树状列出所有块设备
: << comment
NAME MAJ:MIN rm SIZE RO type mountpoint
sda 8:0 0 232.9G 0 disk
├─sda1 8:1 0 46.6G 0 part /
├─sda2 8:2 0 1K 0 part
├─sda5 8:5 0 190M 0 part /boot
├─sda6 8:6 0 3.7G 0 part [SWAP]
├─sda7 8:7 0 93.1G 0 part /data
└─sda8 8:8 0 89.2G 0 part /personal
sr0 11:0 1 1024M 0 rom
```
7个栏目名称如下
1. **NAME** :这是块设备名。
2. **MAJ:MIN** :本栏显示主要和次要设备号。
3. **RM** 本栏显示设备是否可移动设备。注意在本例中设备sdb和sr0的RM值等于1这说明他们是可移动设备。
4. **SIZE** 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB而1K表明该设备大小为1KB。
5. **RO** 该项表明设备是否为只读。在本案例中所有设备的RO值为0表明他们不是只读的。
6. **TYPE** 本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中sda和sdb是磁盘而sr0是只读存储rom
7. **MOUNTPOINT** :本栏指出设备挂载的挂载点。
输出详解如下:
NAME 块设备名
MAJ:MIN 显示主要和次要设备号
RM 显示设备是否可移动设备。注意在本例中设备sdb和sr0的RM值等于1这说明他们是可移动设备
SIZE 列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB而1K表明该设备大小为1KB
RO 表明设备是否为只读。在本案例中所有设备的RO值为0表明他们不是只读的
TYPE 显示块设备是否是磁盘或磁盘上的一个分区。在本例中sda和sdb是磁盘而sr0是只读存储rom
MOUNTPOINT :本栏指出设备挂载的挂载点
comment
默认选项不会列出所有空设备。要查看这些空设备,请使用以下命令:
lsblk -a # 默认选项不会列出所有空设备。-a选项可查看这些空设备
lsblk -nl # 以列表格式输出设备
lsblk -s # -S列出SCSI设备而-s是逆序选项将设备和分区的组织关系逆转过来显示
```
lsblk -a
```
lsblk命令也可以用于列出一个特定设备的拥有关系同时也可以列出组和模式。可以通过以下命令来获取这些信息
```
lsblk -m
```
该命令也可以只获取指定设备的信息。这可以通过在提供给lsblk命令的选项后指定设备名来实现。例如你可能对了解以字节显示你的磁盘驱动器大小比较感兴趣那么你可以通过运行以下命令来实现
```
lsblk -b /dev/sda
等价于
lsblk --bytes /dev/sda
```
你也可以组合几个选项来获取指定的输出。例如,你也许想要以列表格式列出设备,而不是默认的树状格式。你可能也对移除不同栏目名称的标题感兴趣。可以将两个不同的选项组合,以获得期望的输出,命令如下:
```
lsblk -nl
```
要获取SCSI设备的列表你只能使用-S选项。该选项是大写字母S不能和-s选项混淆该选项是用来以颠倒的顺序打印依赖的。
```
lsblk -S
```
lsblk列出SCSI设备而-s是逆序选项将设备和分区的组织关系逆转过来显示其将给出如下输出。输入命令
```
lsblk -s
```

@ -0,0 +1,34 @@
# **lshw**
## 选项
```markdown
usage: lshw [-format] [-options ...]
lshw -version
format can be
-html output hardware tree as HTML
-xml output hardware tree as XML
-json output hardware tree as a JSON object
-short output hardware paths
-businfo output bus information
options can be
-dump OUTFILE save hardware tree to a file
-class CLASS only show a certain class of hardware
-C CLASS same as '-class CLASS'
-c CLASS same as '-class CLASS'
-disable TEST disable a test (like pci, isapnp, cpuid, etc. )
-enable TEST enable a test (like pci, isapnp, cpuid, etc. )
-quiet don't display status
-sanitize sanitize output (remove sensitive information like serial numbers, etc.)
-numeric output numeric IDs (for PCI, USB, etc.)
-notime exclude volatile attributes (timestamps) from output
```
## 实例
```bash
lshw -C network # 只显示硬件的网络信息
```

@ -60,6 +60,7 @@ PCI access options:
```bash
lspci -tv # 显示PCI信息
lspci | grep Ethernet # 显示网卡信息
```

@ -2,18 +2,24 @@
## 说明
**mpstat命令** 指令主要用于多CPU环境下它显示各个可用CPU的状态系你想。这些信息存放在`/proc/stat`文件中。在多CPUs系统里其不但能查看所有CPU的平均状况信息而且能够查看特定CPU的信息
**mpstat命令** 指令主要用于多CPU环境下它显示各个可用CPU的状态系你想。这些信息存放在`/proc/stat`文件中。在多CPUs系统里其不但能
查看所有CPU的平均状况信息而且能够查看特定CPU的信息。[源码](http://github.com/sysstat/sysstat)
## 选项
* 间隔时间:每次报告的间隔时间(秒);
* 次数:显示报告的次数。
```markdown
* 间隔时间:每次报告的间隔时间(秒)
* 次数:显示报告的次数
配置文件目录:/etc/sysconfig
```
## 实例
```bash
# 当mpstat不带参数时输出为从系统启动以来的平均值
# 下面的命令可以每2秒产生了2个处理器的统计数据报告一共产生三个interval 的信息然后再给出这三个interval的平均信息。默认时输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。。
# 下面的命令可以每2秒产生了2个处理器的统计数据报告一共产生三个interval 的信息然后再给出这三个interval的平均信息。默认时输出是
# 按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态
mpstat -P ALL 2 3
# 比较带参数和不带参数的mpstat的结果当要正确反映系统的情况需要正确使用命令的参数。vmstat 和iostat 也需要注意这一问题。

@ -21,28 +21,22 @@ mv命令可以用来将源文件移至一个目标文件中或将一组文件
 mv [选项]... 源文件... 目录
 mv [选项]... -t 目录 源文件...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
必选参数对长短选项同时适用。
--backup[=CONTROL] 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数,当文件存在时,覆盖前,为其创建一个备份
-f, --force 覆盖前不询问
-i, --interactive 覆盖前询问
-n, --no-clobber 不覆盖已存在文件
如果您指定了-i、-f、-n 中的多个,仅最后一个生效。
-n, --no-clobber 不覆盖已存在文件,如果您指定了-i、-f、-n 中的多个,仅最后一个生效
--strip-trailing-slashes 去掉每个源文件参数尾部的斜线
-S, --suffix=SUFFIX 替换常用的备份文件后缀
-t, --target-directory=DIRECTORY 移动所有源文件参数到目录
-T, --no-target-directory treat DEST as a normal file
-u, --update 当源文件比目标文件新或者目标文件不存在时,才执行移动操作
-v, --verbose explain what is being done
-Z, --context set SELinux security context of destination
file to default type
--help 显示此帮助信息并退出
--version 显示版本信息并退出
-Z, --context set SELinux security context of destination file to default type
The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable. Here are the values:
none, off 不进行备份(即使使用了--backup 选项)
numbered, t 备份文件加上数字进行排序
existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
@ -52,7 +46,7 @@ the VERSION_CONTROL environment variable. Here are the values:
## 实例
```bash
mv --
```

@ -0,0 +1 @@
https://github.com/brendangregg/perf-tools

@ -1,29 +1,16 @@
perl
===
perl语言解释器
# perl
## 说明
**perl命令** 是perl语言解释器负责解释执行perl语言程序。
### 语法
```
perl(选项)(参数)
```
## 选项
```
-w输出有用的警告信息
-U允许不安全的操作
-c仅检查文件的语法
-d在调试下运行脚本程序。
```markdown
-w输出有用的警告信息
-U允许不安全的操作
-c仅检查文件的语法
-d在调试下运行脚本程序
```
### 参数
文件要运行的perl脚本程序。
## 实例

@ -106,3 +106,20 @@ ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n
ps -u root | awk '/^test/ {print "kill -9" $1}' | sh # 将用户root下所有进程名以test开头的全部强制杀死
```
## linux进程5种状态
* 运行 (正在运行或在运行队列中等待)
* 中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
* 不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
* 僵死 (进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
* 停止 (进程收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号后停止运行运行)
ps命令标识进程的5种状态码
* D 不可中断 uninterruptible sleep (usually IO)
* R 运行 runnable (on run queue)
* S 中断 sleeping
* T 停止 traced or stopped
* Z 僵死 a defunct (”zombie”) process

@ -1,52 +1,24 @@
pwck
===
用来验证系统认证文件内容和格式的完整性
# pwck
## 说明
**pwck命令** 用来验证系统认证文件`/etc/passwd`和`/etc/shadow`的内容和格式的完整性。
### 语法
```
pwck(选项)(参数)
```
**pwck命令** 用来验证系统认证文件`/etc/passwd`和`/etc/shadow`的内容和格式的完整性
## 选项
```markdown
用法pwck [选项] [passwd [shadow]]
```
-q仅报告错误信息
-s以用户id排序文件“/etc/passwd”和“/etc/shadow”;
-r只读方式运行指令。
-h, --help 显示此帮助信息并推出
-q, --quiet 只报告错误
-r, --read-only 显示错误和警告,但不改变文件
-R, --root CHROOT_DIR chroot 到的目录
-s, --sort 通过 UID 排序项目
```
### 参数
## 实例
* 密码文件:指定密码文件的路径;
* 影子文件:指定影子文件的路径。
### 实例
```
```bash
pwck /etc/passwd
user 'lp': directory '/var/spool/lpd' does not exist
user 'news': directory '/var/spool/news' does not exist
user 'uucp': directory '/var/spool/uucp' does not exist
user 'www-data': directory '/var/www' does not exist
user 'list': directory '/var/list' does not exist
user 'irc': directory '/var/run/ircd' does not exist
user 'gnats': directory '/var/lib/gnats' does not exist
user 'nobody': directory '/nonexistent' does not exist
user 'syslog': directory '/home/syslog' does not exist
user 'couchdb': directory '/var/lib/couchdb' does not exist
user 'speech-dispatcher': directory '/var/run/speech-dispatcher' does not exist
user 'usbmux': directory '/home/usbmux' does not exist
user 'haldaemon': directory '/var/run/hald' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'saned': directory '/home/saned' does not exist
user 'hplip': directory '/var/run/hplip' does not exist
pwck无改变
```
```

@ -1,11 +1,9 @@
# **rpm**
===
RPM软件包的管理工具
## 说明
**rpm命令** 是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序由于它遵循GPL规则且功能强大方便因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现让Linux易于安装升级间接提升了Linux的适用度。
**rpm命令** 是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序由于它遵循GPL规则且功能强大方便
因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现让Linux易于安装升级间接提升了Linux的适用度
## 选项
@ -116,13 +114,21 @@ Options implemented via popt alias/exec:
## 实例
```bash
rpm -ivh package.rpm # 安装rpm包
rpm -ivh --force package.rpm # 强制安装rpm包
rpm -ivh --nodeps package.rpm # 忽略依赖安装rpm包
rpm -ivh --replacepkgs package.rpm # 覆盖安装软件包
rpm -e 包名 # 卸载软件包,包名可以包含版本号等信息,但是不可以有后缀.rpm
rpm -ivh --excludedocs package.rpm # 安装rpm包时不安装帮助文档
rpm -ivh --prefix=/usr/local package.rpm # 指定软件包安装的路径
rpm -ivh --test package.rpm # 只对软件包安装进行测试,不进行实际的安装
rpm -Uvh 包名 # 升级rpm包
rpm -qa # 列出所有安装过的包
rpm -q mysql # 获取mysql软件包全名
rpm -qa --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n # 显示所有在rpm发布版上安装的包并以包字节大小为序
rpm -ivh your-package.rpm # 安装rpm包
rpm -ivh --force your-package.rpm # 强制安装rpm包
rpm -ivh --nodeps your-package.rpm # 忽略依赖安装rpm包
rpm -e 包名 # 卸载软件包,包名可以包含版本号等信息,但是不可以有后缀.rpm
rpm -qd vsftpd # 查询软件包vsftpd帮助文件
rpm -qdp package.rpm # 查询未安装的软件包的帮助文件
rpm -qc package.rpm # 查询软件包配置文件
# 有些软件包是以.src.rpm结尾的这类软件包是包含了源代码的rpm包在安装时需要进行编译。这类软件包有两种安装方法
# 方法一:

@ -4,7 +4,7 @@
**sar命令** System Activity Reporter是Linux下系统运行状态统计工具它将指定的操作系统状态计数器显示到标准输出设备。sar工
具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取
样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小
样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。[源码](http://github.com/sysstat/sysstat)
```markdown
sar命令常用格式
@ -25,8 +25,10 @@ sar [options] [-A] [-o file] t [n]
-w 显示交换分区状态
-x 显示给定进程的状态
* 间隔时间:每次报告的间隔时间(秒);
* 次数:显示报告的次数。
* 间隔时间:每次报告的间隔时间(秒)
* 次数:显示报告的次数
配置文件目录:/etc/sysconfig
```
## 实例

@ -86,130 +86,7 @@ C-a ] -> paste把刚刚在 copy mode 选定的内容贴上
## 使用screen
```bash
**创建一个新的窗口**
安装完成后直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字实践上推荐为每个screen会话取一个名字方便分辨
[root@TS-DEV ~]# screen -S david
```
screen启动后会创建第一个窗口也就是窗口No. 0并在其中打开一个系统默认的shell一般都会是bash。所以你敲入命令screen之后会立刻又返回到命令提示符仿佛什么也没有发生似的其实你已经进入Screen的世界了。当然也可以在screen命令之后加入你喜欢的参数使之直接打开你指定的程序例如
```
[root@TS-DEV ~]# screen vi david.txt
```
screen创建一个执行vi david.txt的单窗口会话退出vi 将退出该窗口/会话。
**查看窗口和窗口名称**
打开多个窗口后可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端这个列表会列在屏幕左下角如果使用X环境下的终端模拟器这个列表会列在标题栏里。窗口列表的样子一般是这样
```
0$ bash 1-$ bash 2*$ bash
```
这个例子中我开启了三个窗口,其中*号表示当前位于窗口2-号表示上一次切换窗口时位于窗口1。
Screen默认会为窗口命名为编号和窗口中运行程序名的组合上面的例子中窗口都是默认名字。练习了上面查看窗口的方法你可能就希望各个窗口可以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名按下快捷键后Screen会允许你为当前窗口输入新的名字回车确认。
**会话分离与恢复**
你可以不中断screen窗口中程序的运行而暂时断开detachscreen会话并在随后时间重新连接attach该会话重新控制各窗口中运行的程序。例如我们打开一个screen窗口编辑/tmp/david.txt文件
```
[root@TS-DEV ~]# screen vi /tmp/david.txt
```
之后我们想暂时退出做点别的事情比如出去散散步那么在screen窗口键入C-a dScreen会给出detached提示
暂时中断会话
!
半个小时之后回来了找到该screen会话
```
[root@TS-DEV ~]# screen -ls
# 创建一个新的窗口,推荐为每个screen会话取一个名字方便分辨
screen -S david
# 查看窗口和窗口名称,打开多个窗口后可以使用快捷键C-a w列出当前所有窗口。
```
!
重新连接会话:
```
[root@TS-DEV ~]# screen -r 12865
```
一切都在。
当然如果你在另一台机器上没有分离一个Screen会话就无从恢复会话了。这时可以使用下面命令强制将这个会话从它所在的终端分离转移到新的终端上来
!
**清除dead 会话**
如果由于某种原因其中一个会话死掉了例如人为杀掉该会话这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话
!
**关闭或杀死窗口**
正常情况下当你退出一个窗口中最后一个程序通常是bash这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k这个快捷键杀死当前的窗口同时也将杀死这个窗口中正在运行的进程。
如果一个Screen会话中最后一个窗口被关闭了那么整个Screen会话也就退出了screen进程会被终止。
除了依次退出/杀死当前Screen会话中所有窗口这种方法之外还可以使用快捷键C-a :然后输入quit命令退出Screen会话。需要注意的是这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多包括分屏可以输入split等这也是实现Screen功能的一个途径不过个人认为还是快捷键比较方便些。
### screen 高级应用 
**会话共享**
还有一种比较好玩的会话恢复可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器然后你创建一个screen会话你朋友可以在他的终端上命令
```
[root@TS-DEV ~]# screen -x
```
这个命令会将你朋友的终端Attach到你的Screen会话上并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了如果你们当前又处于同一个窗口那就相当于坐在同一个显示器前面你的操作会同步演示给你朋友你朋友的操作也会同步演示给你。当然如果你们切换到这个会话的不同窗口中去那还是可以分别进行不同的操作的。
**会话锁定与解锁**
Screen允许使用快捷键C-a s锁定会话。锁定以后再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。
也可以使用C-a x锁定会话不同的是这样锁定之后会话会被Screen所属用户的密码保护需要输入密码才能继续访问这个会话。
**发送命令到screen会话**
在Screen会话之外可以通过screen命令操作一个Screen会话这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围这里只看一个例子体会一下在会话之外对Screen的操作
```
[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com
```
这个命令在一个叫做sandy的screen会话中创建一个新窗口并在其中运行ping命令。
**屏幕分割**
现在显示器那么大将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割Screen 4.00.03版本以后也支持垂直分屏快捷键是C-a |。分屏以后可以使用C-a <tab>在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。
可以用C-a X快捷键关闭当前焦点所在的屏幕区块也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭还可以通过窗口切换找到它。
!
**C/P模式和操作**
screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a <Esc>或者C-a [可以进入copy/paste模式这个模式下可以像在vi中一样移动光标并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作譬如使用/进行搜索使用y快速标记一行使用w快速标记一个单词等。关于C/P模式下的高级操作其文档的这一部分有比较详细的说明。
一般情况下可以移动光标到指定位置按下空格设置一个开头标记然后移动光标到结尾位置按下空格设置第二个标记同时会将两个标记之间的部分储存在copy/paste buffer中并退出copy/paste模式。在正常模式下可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。
!
**更多screen功能**
同大多数UNIX程序一样GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多例如设定screen选项定制绑定键设定screen会话自启动窗口启用多用户模式定制用户访问权限控制等等。如果你愿意的话也可以自己指定screen配置文件。
以多用户功能为例screen默认是以单用户模式运行的你需要在配置文件中指定multiuser on 来打开多用户模式通过acl*acladd,acldel,aclchg...命令你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

@ -2,51 +2,41 @@
## 说明
**set命令** 作用主要是显示系统中已经存在的shell变量以及设置shell变量的新变量值。使用set更改shell特性时符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量可以使用declare命令以`变量名=值`的格式进行定义即可。
**set命令** 作用主要是显示系统中已经存在的shell变量以及设置shell变量的新变量值。使用set更改shell特性时符号+和-
的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量可以使用declare命令以变量名=
值的格式进行定义即可
## 选项
```markdown
-a标示已修改的变量,以供输出至环境变量
-b使被中止的后台程序立刻回报执行状态
-C转向所产生的文件无法覆盖已存在的文件
-dShell预设会用杂凑表记忆使用过的指令以加速指令的执行。使用-d参数可取消
-e若指令传回值不等于0则立即退出shell
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell可利用"!"加<指令编号>的方式来执行history中记录的指令
-k指令所给的参数都会被视为此指令的环境变量
-l记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P启动-P参数后执行指令时会以实际的文件或目录来取代符号连接
-t执行完随后的指令即退出shell。
-u当执行时使用到未定义过的变量,则显示错误信息
-v显示shell所读取的输入值。
-x执行指令后,会先显示该指令及所下的参数
-a 标示已修改的变量,以供输出至环境变量
-b 使被中止的后台程序立刻回报执行状态
-C 转向所产生的文件无法覆盖已存在的文件
-d Shell预设会用杂凑表记忆使用过的指令以加速指令的执行。使用-d参数可取消
-e 若指令传回值不等于0则立即退出shell
-f 取消使用通配符
-h 自动记录函数的所在位置
-H Shell可利用"!"加<指令编号>的方式来执行history中记录的指令
-k 指令所给的参数都会被视为此指令的环境变量
-l 记录for循环的变量名称
-m 使用监视模式
-n 只读取指令,而不实际执行
-p 启动优先顺序模式
-P 启动-P参数后执行指令时会以实际的文件或目录来取代符号连接
-t 执行完随后的指令即退出shell
-u 当执行时使用到未定义过的变量,则显示错误信息
-v 显示shell所读取的输入值
-x 执行指令后,会先显示该指令及所下的参数
```
## 实例
使用declare命令定义一个新的环境变量"mylove",并且将其值设置为"Visual C++",输入如下命令:
```
```bash
# 使用declare命令定义一个新的环境变量"mylove",并且将其值设置为"Visual C++",输入如下命令:
declare mylove='Visual C++' #定义新环境变量
```
再使用set命令将新定义的变量输出为环境变量输入如下命令
```
# 再使用set命令将新定义的变量输出为环境变量输入如下命令
set -a mylove #设置为环境变量
```
执行该命令后将会新添加对应的环境变量。用户可以使用env命令和grep命令分别显示和搜索环境变量"mylove",输入命令如下:
```
env | grep mylove #显示环境变量值
```
此时,该命令执行后,将输出查询到的环境变量值。

@ -1,52 +1,34 @@
su
===
用于切换当前用户身份到其他用户身份
# **su**
## 说明
**su命令** 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
### 语法
```
su(选项)(参数)
```
**su命令** 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码
## 选项
```
-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
-f或——fast适用于csh与tsch使shell不用去读取启动文件
-l或——login改变身份时也同时变更工作目录以及HOME,SHELL,USER,logname。此外也会变更PATH变量
-m,-p或--preserve-environment变更身份时不要变更环境变量
-s<shell>或--shell=<shell>指定要执行的shell
--help显示帮助
--version显示版本信息。
```
### 参数
```markdown
su [选项] [-] [USER [参数]...]
用户:指定要切换身份的目标用户
将有效用户id和组id更改为USER的id。单个 - 视为 -l。如果未指定USER将假定为root。
### 实例
-m, -p, --preserve-environment 不重置环境变量
-g, --group <组> 指定主组
-G, --supp-group <组> 指定一个辅助组
变更帐号为root并在执行ls指令后退出变回原使用者
-, -l, --login 使 shell 成为登录 shell
-c, --command <命令> 使用 -c 向 shell 传递一条命令
--session-command <命令> 使用 -c 向 shell 传递一条命令
而不创建新会话
-f, --fast 向shell 传递 -f 选项(csh 或 tcsh)
-s, --shell <shell> 若 /etc/shells 允许,则运行 shell
```
su -c ls root
```
变更帐号为root并传入`-f`选项给新执行的shell
```
su root -f
```
## 实例
变更帐号为test并改变工作目录至test的家目录
```bash
su -c ls root # 变更帐号为root并在执行ls指令后退出变回原使用者
su root -f # 变更帐号为root并传入`-f`选项给新执行的shell
su -test # 变更帐号为test并改变工作目录至test的家目录
```
su -test
```

@ -1,188 +1,39 @@
sysctl
===
时动态地修改内核的运行参数
# **sysctl**
## 说明
**sysctl命令** 被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录`/proc/sys`中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。
### 语法
```
sysctl(选项)(参数)
```
```
-n打印值时不打印关键字
-e忽略未知关键字错误
-N仅打印名称
-w当改变sysctl设置时使用此项
-p从配置文件“/etc/sysctl.conf”加载内核参数设置
-a打印当前所有可用的内核参数变量和值
-A以表格方式打印当前所有可用的内核参数变量和值。
```
### 参数
变量=值:设置内核参数对应的变量值。
### 实例
查看所有可读变量:
sysctl -a
读一个指定的变量,例如`kern.maxproc`
sysctl kern.maxproc kern.maxproc: 1044
要设置一个指定的变量,直接用`variable=value`这样的语法:
```
sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000
```
您可以使用sysctl修改系统变量也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf看起来很像rc.conf。它用`variable=value`的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。
sysctl变量的设置通常是字符串、数字或者布尔型。布尔型用 1 来表示'yes',用 0 来表示'no')。
```
sysctl -w kernel.sysrq=0
sysctl -w kernel.core_uses_pid=1
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_keepalive_time=3600
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_sack=1
```
### 配置sysctl
编辑此文件:`/etc/sysctl.conf`
**sysctl命令** 被用于在内核运行时动态地查看修改内核的运行参数,可用的内核参数在目录`/proc/sys`中。它包含一些TCP/ip堆栈和虚拟内存系统
的高级选项
如果该文件为空,则输入以下内容,否则请根据情况自己做调整:
## 选项
```
# Controls source route verification
# Default should work for all interfaces
net.ipv4.conf.default.rp_filter = 1
# net.ipv4.conf.all.rp_filter = 1
# net.ipv4.conf.lo.rp_filter = 1
# net.ipv4.conf.eth0.rp_filter = 1
# Disables IP source routing
# Default should work for all interfaces
net.ipv4.conf.default.accept_source_route = 0
# net.ipv4.conf.all.accept_source_route = 0
# net.ipv4.conf.lo.accept_source_route = 0
# net.ipv4.conf.eth0.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Increase maximum amount of memory allocated to shm
# Only uncomment if needed!
# kernel.shmmax = 67108864
# Disable ICMP Redirect Acceptance
# Default should work for all interfaces
net.ipv4.conf.default.accept_redirects = 0
# net.ipv4.conf.all.accept_redirects = 0
# net.ipv4.conf.lo.accept_redirects = 0
# net.ipv4.conf.eth0.accept_redirects = 0
# enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
# Default should work for all interfaces
net.ipv4.conf.default.log_martians = 1
# net.ipv4.conf.all.log_martians = 1
# net.ipv4.conf.lo.log_martians = 1
# net.ipv4.conf.eth0.log_martians = 1
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 25
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1200
# Turn on the tcp_window_scaling
net.ipv4.tcp_window_scaling = 1
# Turn on the tcp_sack
net.ipv4.tcp_sack = 1
# tcp_fack should be on because of sack
net.ipv4.tcp_fack = 1
# Turn on the tcp_timestamps
net.ipv4.tcp_timestamps = 1
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
```markdown
-a, --all 显示当前所有可用的内核参数变量和值
-A alias of -a(但以表格方式显示)
-X alias of -a
--deprecated include deprecated parameters to listing
-b, --binary print value without new line
-e, --ignore ignore unknown variables errors
-N, --names print variable names without values
-n, --values print only values of a variables
-p, --load[=<file>] read values from file
-f alias of -p
--system read values from all system directories
-r, --pattern <expression> select setting that match expression
-q, --quiet do not echo variable set
-w, --write enable writing a value to variable;当改变sysctl设置时使用此项
-o does nothing
-x does nothing
-d alias of -h
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# make more local ports available
# net.ipv4.ip_local_port_range = 1024 65000
# set TCP Re-Ordering value in kernel to 5
net.ipv4.tcp_reordering = 5
# Lower syn retry rates
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
# Set Max SYN Backlog to 2048
net.ipv4.tcp_max_syn_backlog = 2048
# Various Settings
net.core.netdev_max_backlog = 1024
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 256
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 360000
# This will increase the amount of memory available for socket input/output queues
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960
```
如果希望屏蔽别人 ping 你的主机,则加入以下代码:
## 实例
```
# Disable ping requests
net.ipv4.icmp_echo_ignore_all = 1
```
```bash
编辑完成后,请执行以下命令使变动立即生效:
sysctl -a # 查看所有可读内核变量
sysctl net.nf_conntrack_max # 读取一个指定的变量例如net.nf_conntrack_max
sysctl net.nf_conntrack_max=262144 # 要设置一个指定的变量直接用variable=value,但并不是所有的变量都可以在这个模式下设定
```
/sbin/sysctl -p
/sbin/sysctl -w net.ipv4.route.flush=1
```

@ -81,15 +81,11 @@
--no-same-permissions
从归档中解压权限时使用用户的掩码位(默认为普通用户服务)
--numeric-owner 总是以数字代表用户/组的名称
--owner=名称 强制将 NAME
作为所添加的文件的所有者
-p, --preserve-permissions, --same-permissions
解压文件权限信息(默认只为超级用户服务)
--owner=名称 强制将 NAME作为所添加的文件的所有者
-p, --preserve-permissions, --same-permissions 解压文件权限信息(默认只为超级用户服务)
--preserve 与 -p 和 -s 一样
--same-owner
尝试解压时保持所有者关系一致(超级用户默认此项)
-s, --preserve-order, --same-order
为解压至匹配归档排序名称
--same-owner 尝试解压时保持所有者关系一致(超级用户默认此项)
-s, --preserve-order, --same-order 为解压至匹配归档排序名称
Handling of extended file attributes:
--acls Enable the POSIX ACLs support
--no-acls Disable the POSIX ACLs support
@ -358,13 +354,13 @@ tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
tar -zxvf log.tar.gz # 将tar包解压缩
tar -ztvf log.tar.gz # 查阅上述tar包内有哪些文件选项z表示由gzip压缩的
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log # 在预设的情况下,我们可以将压缩档在任何地方解开的;只将tar内的部分文件解压出来
tar -zcvpf log.tar.gz archive-$(date +%Y%m%d).log # 文件备份下来,并且保存其权限;这个`-p`的属性是很重要的,尤其是当您要保留原本文件的属性时。在文件夹当中,比某个日期新的文件才备份
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log # 只将tar内的部分文件解压出来
tar -zcvpf log.tar.gz archive-$(date +%Y%m%d).log # 文件备份下来,并且保存其权限;这个`-p`的属性
tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' # 将目录dir/压缩打包并放到远程机器上
tar -c /dir/to/copy | cd /where/to/ && tar -x -p # 拷贝目录copy/到目录/where/to/并保持文件属性
tar -c /dir/to/copy | ssh -C user@remote 'cd /where/to/ && tar -x -p' # 拷贝目录copy/到远程目录/where/to/并保持文件属性
find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 # 将目录dir及其子目录所有txt文件打包并用bzip2压缩
tar --exclude scf/service -zcvf scf.tar.gz scf/* # 备份文件夹内容时排除部分文件
tar --exclude=scf/service -zcvf scf.tar.gz scf/* # 备份文件夹内容时排除部分文件
tar -xvf log.tar.gz --wildcards "*.txt" # 解压以txt结尾的文件
tar -czwf log.tar.gz /dir/* # 将dir目录下所有文件压缩w选项表示每个文件添加到存档之前要求确认
tar -cvWf log.tar /dir/ # 验证压缩包中的文件W选项表示验证

@ -26,20 +26,22 @@
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的如果在命令行中使用了-s选项 其中一些命令可能会被屏蔽
```markdown
k 终止一个进程
i 忽略闲置和僵死进程,这是一个开关式命令
h 帮助命令
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
k 杀死一个进程
<space>(空格按键) 立即刷新
s 改变两次刷新之间的延迟时间单位为s如果有小数就换算成ms。输入0值则系统将不断刷新默认值是5s
S 切换到累计模式
c 切换显示命令名称和完整命令行
t 切换显示进程和CPU状态信息
m 切换显示内存信息
l 切换显示平均负载和启动时间信息
f或者F 从当前显示中添加或者删除项目
o或者O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
i 忽略闲置和僵死进程,这是一个开关式命令,即只显示正在运行的进程
r 修改一个进程的优先级别即renice值
M 根据驻留内存大小进行排序
T 根据时间/累计时间进行排序
w 将当前设置写入~/.toprc文件中
```
@ -86,5 +88,17 @@ Swap:  5144568k total 交换区总量
5144512k free 空闲交换区总量
2013180k cached 缓冲的交换区总量
PID 进程ID
USER 进程所有者
PR 进程优先级,越小越先被执行
NI nice值
VIRT 进程占用的虚拟内存
RES 进程占用的物理内存
SHR 进程使用的共享内存
S 进程的状态S休眠R运行Z僵尸进程N进程优先级值为负数
%CPU 进程占用CPU的使用率
%MEM 进程使用的物理内存和总内存百分比
TIME+ 进程启动占用的总CPU时间即占用CPU使用时间的累加值
COMMAND 进程启动命令名称
```

@ -8,33 +8,16 @@
## 选项
```markdown
-a或--time=atime或--time=access或--time=use 只更改存取时间;
-c或--no-create 不建立任何文件;
-d<时间日期> 使用指定的日期时间,而非现在的时间;
-f此参数将忽略不予处理仅负责解决BSD版本touch指令的兼容性问题
-m或--time=mtime或--time=modify 只更该变动时间;
-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t<日期时间> 使用指定的日期时间,而非现在的时间;
用法touch [选项]... 文件...
Update the access and modification times of each FILE to the current time.
A FILE argument that does not exist is created empty, unless -c or -h
is supplied.
A FILE argument string of - is handled specially and causes touch to
change the times of the file associated with standard output.
Mandatory arguments to long options are mandatory for short options too.
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用指定字符串表示时间而非当前时间
-f (忽略)
-h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地
(当系统支持更改符号链接的所有者时,此选项才有用)
-m 只更改修改时间
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
用法touch [选项]... 文件..
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用指定字符串表示时间而非当前时间
-f (忽略)
-h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地,(当系统支持更改符号链接的所有者时,此选项才有用)
-m 只更改修改时间
-r, --reference=FILE 用参考文件的时间取代当前时间
-t STAMP 使用指定的[[CC]YY]MMDDhhmm[.ss]时间取代当前时间
--time=WORD change the specified time:
WORD is access, atime, or use: equivalent to -a
WORD is modify or mtime: equivalent to -m

@ -44,6 +44,8 @@ useradd [选项] 登录
## 实例
```bash
useradd -D # 显示默认的useradd配置
# 一个用户只能且必须属于一个g可以属于多个G
useradd -g sales jack -G company,employees # 新建用户jack同时指定所属组主组为sales附加组为company,employees

@ -5,21 +5,21 @@
**vmstat命令** 的含义为显示虚拟内存状态“Viryual Memor Statics”但是它可以报告关于进程、内存、I/O等系统整体运行状态
```markdown
-a显示活动内页
-f显示boot启动后创建的进程总数
-m显示slab信息
-n头信息仅显示一次
-s以表格方式显示事件计数器和内存状态
-d报告磁盘状态
-a显示活动内页
-f显示boot启动后创建的进程总数
-m显示slab信息
-n头信息仅显示一次
-s以表格方式显示事件计数器和内存状态
-d报告磁盘状态
-D: --disk-sum summarize disk statistics
-p显示指定的硬盘分区状态
-S输出信息的单位
-p显示指定的硬盘分区状态
-S输出信息的单位
-w: --wide wide output
-t: --timestamp show timestamp
简单示例vmstat 1 5 # 时间间隔1秒输出5次
* 事件间隔:状态信息刷新的时间间隔
* 次数:显示报告的次数
* 事件间隔:状态信息刷新的时间间隔
* 次数:显示报告的次数
```
## 实例
@ -39,45 +39,47 @@ Procs进程
Memory内存
* swpd: 使用虚拟内存大小如果swpd的值不为0但是SISO的值长期为0这种情况不会影响系统性能
* free: 空闲物理内存大小
* buff: 用作缓冲的内存大小
* cache: 用作缓存的内存大小,如果cache的值大的时候说明cache处的文件数多如果频繁访问到的文件都能被cache处那么磁盘的读IO bi会非常小。
* swpd: 使用虚拟内存大小如果swpd的值不为0但是SISO的值长期为0这种情况不会影响系统性能
* free: 空闲物理内存大小
* buff: 用作缓冲的内存大小
* cache: 用作缓存的内存大小,若cache的值比较大说明cache的文件过多若频繁访问的文件都在cache则磁盘的读IO bi会非常小
Swap
* si: 每秒从交换区写到内存的大小,由磁盘调入内存
* so: 每秒写入交换区的内存大小,由内存调入磁盘
* si: 每秒从交换区写到内存的大小,由磁盘调入内存
* so: 每秒写入交换区的内存大小,由内存调入磁盘
注意内存够用的时候这2个值都是0如果这2个值长期大于0时系统性能会受到影响磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存free很少的或接近于0时就认为内存不够用了不能光看这一点还要结合si和so如果free很少但是si和so也很少大多时候是0那么不用担心系统性能这时不会受到影响的。
注意内存够用的时候这2个值都是0如果这2个值长期大于0时系统性能会受到影响磁盘IO和CPU资源都会被消耗。有些朋友看到
空闲内存free很少的或接近于0时就认为内存不够用了不能光看这一点还要结合si和so如果free很少但是si和so也很少
大多时候是0那么不用担心系统性能这时不会受到影响的
IO现在的Linux版本块的大小为1kb
* bi: 每秒读取的块数
* bo: 每秒写入的块数
注意随机磁盘读写的时候这2个值越大如超出1024k)能看到CPU在IO等待的值也会越大
注意随机磁盘读写的时候这2个值越大如超出1024k)能看到CPU在IO等待的值也会越大
system系统
* in: 每秒中断数,包括时钟中断
* cs: 每秒上下文切换数
* in: 每秒中断数,包括时钟中断
* cs: 每秒上下文切换数
注意上面2个值越大会看到由内核消耗的CPU时间会越大
注意上面2个值越大会看到由内核消耗的CPU时间会越大
CPU以百分比表示
* us: 用户进程执行时间百分比(user time)
us的值比较高时说明用户进程消耗的CPU时间多但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速
us的值比较高时说明用户进程消耗的CPU时间多但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速
* sy: 内核系统进程执行时间百分比(system time)
sy的值高时说明系统内核消耗的CPU资源多这并不是良性表现我们应该检查原因
sy的值高时说明系统内核消耗的CPU资源多这并不是良性表现我们应该检查原因
* wa: IO等待时间百分比
wa的值高时说明IO等待比较严重这可能由于磁盘大量作随机访问造成也有可能磁盘出现瓶颈块操作
wa的值高时说明IO等待比较严重这可能由于磁盘大量作随机访问造成也有可能磁盘出现瓶颈块操作
* id: 空闲时间百分比

@ -6,6 +6,8 @@
因下载失败wget会不断的尝试直到整个文件下载完毕。如果是服务器打断下载过程它会再次联到服务器上从停止的地方继续下载。
这对从那些限定了链接时间的服务器上下载大文件非常有用
[wget官网](http://www.gnu.org/software/wget/)
wget支持HTTPHTTPS和FTP协议可以使用HTTP代理。所谓的自动下载是指wget可以在用户退出系统的之后在后台执行。这意味这你可
以登录系统启动一个wget下载任务然后退出系统wget将在后台执行直到任务完成相对于其它大部分浏览器在下载大量数据时需要
用户一直的参与,这省去了极大的麻烦
@ -22,7 +24,7 @@ wget支持HTTPHTTPS和FTP协议可以使用HTTP代理。所谓的自动下
wget [选项]... [URL]...
```sh
```markdown
长选项所必须的参数在使用短选项时也是必须的
启动:
@ -215,7 +217,7 @@ wget--limit-rate=300k http://www.jsdig.com/testfile.zip # wget限速下载
wget -bc http://www.jsdig.com/testfile.zip # -b进行后台下载-c实现断点续传
wget -m -p --convert-links -P ./LOCAL URL # 下载整个网站到本地
cd path && wget -nd -pHEKk <http://www.pixelbeat.org/cmdline.html> # cd到目录中下载指定网页及其相关的文件使其可完全浏览
cd path && wget -nd -pHEKk http://www.pixelbeat.org/cmdline.html # cd到目录中下载指定网页及其相关的文件使其可完全浏览
wget --user-agent="Mozilla/5.0" http://www.jsdig.com/testfile.zip # 伪装代理名称下载
wget --mirror http://www.example.com/ # 更新网站的本地拷贝可以方便地用于cron
wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/ # 批量下载文件到当前目录中

@ -2,11 +2,12 @@
## 说明
**which命令** 用于查找并显示给定命令的绝对路径环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说使用which命令就可以看到某个系统命令是否存在以及执行的到底是哪一个位置的命令
**which命令** 用于查找并显示给定命令的绝对路径环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里
查找符合条件的文件。也就是说使用which命令就可以看到某个系统命令是否存在以及执行的到底是哪一个位置的命令
```info
```markdown
--skip-dot Skip directories in PATH that start with a dot
--skip-tilde Skip directories in PATH that start with a tilde
--show-dot Don't expand a dot to current directory in output
@ -21,9 +22,9 @@
## 实例
```sh
# 说明which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的所以不同的 PATH 配置内容所找到的命令当然不一样
```bash
# 说明which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的所以不同的PATH配置内容所找到的命令不一样
which cd # 用 which 去找出 cd
# cd 这个常用的命令找不到为什么呢这是因为cd是bash内建的命令但是 which 默认是找 PATH 内所规范的目录,所以一定找不到的!
```

@ -1,54 +1,42 @@
who
===
显示目前登录系统的用户信息
# **who**
## 说明
**who命令** 是显示目前登录系统的用户信息。执行who命令可得知目前有那些用户登入系统单独执行who命令会列出登入帐号使用的终端机登入时间以及从何处登入或正在使用哪个X显示器。
### 语法
**who命令** 是显示目前登录系统的用户信息。执行who命令可得知目前有那些用户登入系统单独执行who命令会列出登入帐号使用的终端机登入
时间以及从何处登入或正在使用哪个X显示器
## 选项
```markdown
-a, --all 等于-b -d --login -p -r -t -T -u 选项的组合
-b, --boot 上次系统启动时间
-d, --dead 显示已死的进程
-H, --heading 输出头部的标题列
-l--login 显示系统登录进程
--lookup 尝试通过 DNS 查验主机名
-m 只面对和标准输入有直接交互的主机和用户
-p, --process 显示由 init 进程衍生的活动进程
-q, --count 列出所有已登录用户的登录名与用户数量
-r, --runlevel 显示当前的运行级别
-s, --short 只显示名称、线路和时间(默认)
-T, -w, --mesg 用+- 或 ? 标注用户消息状态
-u, --users 列出已登录的用户
--message 等于-T
--writable 等于-T
If FILE is not specified, use /var/run/utmp. /var/log/wtmp as FILE is common.
If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual
```
who(选项)(参数)
```
## 实例
```
-H或--heading显示各栏位的标题信息列
-i或-u或--idle显示闲置时间若该用户在前一分钟之内有进行任何动作将标示成"."号如果该用户已超过24小时没有任何动作则标示出"old"字符串;
-m此参数的效果和指定"am i"字符串相同;
-q或--count只显示登入系统的帐号名称和总人数
-s此参数将忽略不予处理仅负责解决who指令其他版本的兼容性问题
-w或-T或--mesg或--message或--writable显示用户的信息状态栏
--help在线帮助
--version显示版本信息。
```
```bash
who -q
who -H
who -w
### 参数
文件:指定查询文件。
### 实例
```
[root@localhost ~]# who
root pts/0 2013-08-19 15:04 (192.168.0.134)
root pts/1 2013-12-20 10:37 (180.111.155.40)
[root@localhost ~]# who -q
root root
# users=2
[root@localhost ~]# who -H
NAME LINE time COMMENT
root pts/0 2013-08-19 15:04 (192.168.0.134)
root pts/1 2013-12-20 10:37 (180.111.155.40)
[root@localhost ~]# who -w
root + pts/0 2013-08-19 15:04 (192.168.0.134)
root + pts/1 2013-12-20 10:37 (180.111.155.40)
```

@ -2,15 +2,10 @@
## 说明
**yum命令** 是在Fedora、RedHat以及SUSE中基于rpm的软件包管理器它可以使系统管理人员交互和自动化地更细与管理RPM软件包能够从指定的服务器自动下载RPM包并且安装可以自动处理依赖性关系并且一次安装所有依赖的软体包无须繁琐地一次次下载、安装
### 语法
```
yum(选项)(参数)
```
**yum命令** 是在Fedora、RedHat以及SUSE中基于rpm的软件包管理器它可以使系统管理人员交互和自动化地更细与管理RPM软件包能够从指定的
服务器自动下载RPM包并且安装可以自动处理依赖性关系并且一次安装所有依赖的软体包无须繁琐地一次次下载、安装
## 选项
```info
用法: yum [options] COMMAND
@ -100,9 +95,10 @@ Options:
## 实例
```sh
```bash
yum grouplist # 查看可能批量安装的列表
yum groupinsall group1 # 安装程序组group1
yum check-update # 检查软件包最新版本
# 检查 MySQL 是否已安装
yum list installed | grep mysql

119
ls.md

@ -0,0 +1,119 @@
warning: CRLF will be replaced by LF in Linux_man_cn/apt-get.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/badblocks.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/crontab.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/gdb.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/iostat.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/kill.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/ldd.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/mv.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/ps.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/screen.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/set.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/tar.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/top.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/touch.md.
The file will have its original line endings in your working directory
warning: CRLF will be replaced by LF in Linux_man_cn/vmstat.md.
The file will have its original line endings in your working directory
diff --git a/Linux_man_cn/apt-get.md b/Linux_man_cn/apt-get.md
index 025c7f7..42e1a42 100644
--- a/Linux_man_cn/apt-get.md
+++ b/Linux_man_cn/apt-get.md
@@ -2,79 +2,38 @@

## 说明

-**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起大体就如同Windows上的安装文件。
+**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个
+应用的文件包在一起大体就如同Windows上的安装文件

-```
--c指定配置文件。
-```
-
-### 参数 
-
-* 管理指令对APT软件包的管理操作
-* 软件包:指定要操纵的软件包。
-
-### 实例 
+## 选项

-使用apt-get命令的第一步就是引入必需的软件库Debian的软件库也就是所有Debian软件包的集合它们存在互联网上的一些公共站点上。把它们的地址加入apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件其格式如下
+```markdown

-```
-deb web或[ftp地址] [发行版名字] main/contrib/non-[free]
```

-我们常用的Ubuntu就是一个基于Debian的发行我们使用apt-get命令获取这个列表以下是我整理的常用命令
+## 实例

-在修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的:
+```markdown
+使用apt-get命令的第一步就是引入必需的软件库Debian的软件库也就是所有Debian软件包的集合它们存在互联网上的一些公共
+站点上。把它们的地址加入apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件其格式如下
+deb web或[ftp地址] [发行版名字] main/contrib/non-[free]

-```
+修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。需要定期运行这一命令以确保您的软件包列表是最新的:
apt-get update
```

-安装一个新软件包:
-
-```
-apt-get install packagename
-```
-
-卸载一个已安装的软件包(保留配置文件):
-
-```
-apt-get remove packagename
-```
-
-卸载一个已安装的软件包(删除配置文件):
-
-```
-apt-get purge remove packagename
-```
-
-会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件:
-
-```
-apt-get autoclean apt
-```
-
-这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的:
-
-```
-apt-get clean
-```
-
-更新所有已安装的软件包:
-
-```
-apt-get upgrade
-```
-
-将系统升级到新版本:
-
-```
-apt-get dist-upgrade
-```

-定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式您可以释放大量的磁盘空间。如果您的需求十分迫切可以使用`apt-get clean`以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试:
+```
Loading…
Cancel
Save