umask

显示或设置创建文件的权限掩码。

概要

1
umask [-p] [-S] [mode]

主要用途

  • 显示当前的文件权限掩码。
  • 通过八进制数的方式设置创建文件的权限掩码。
  • 通过符号组合的方式设置创建文件的权限掩码。

参数

mode(可选):八进制数或符号组合。

选项

1
2
-p:当没有参数时指定该选项,执行产生的输出格式可复用为输入;
-S:以符号组合的方式输出创建文件的权限掩码,不使用该选项时以八进制数的形式输出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

以下的例子均假设文件权限掩码为0022。

1
2
3
4
5
6
7
8
# 以八进制数的形式输出创建文件的权限掩码。
umask -p
# 执行结果:
umask 0022
# 以符号组合的方式输出创建文件的权限掩码。
umask -S
# 执行结果:
u=rwx,g=rx,o=rx

参考man chmod文档的DESCRIPTION段落得知:

  • u符号代表当前用户。
  • g符号代表和当前用户在同一个组的用户,以下简称组用户。
  • o符号代表其他用户。
  • a符号代表所有用户。
  • r符号代表读权限以及八进制数4
  • w符号代表写权限以及八进制数2
  • x符号代表执行权限以及八进制数1
  • +符号代表添加目标用户相应的权限。
  • -符号代表删除目标用户相应的权限。
  • =符号代表添加目标用户相应的权限,删除未提到的权限。

那么刚才以符号形式输出的结果u=rwx,g=rx,o=rx转化为八进制数等于0755

用八进制数来设置同样的权限,umask需要额外的执行减法0777 - 07550022,而chmod不需要。

符号组合模式的添加、删除、赋值权限。

1
2
3
4
5
6
7
8
9
10
11
# 添加权限:
# 为组用户添加写权限。
umask g+w
# 删除权限:
# 删除其他用户的写、执行权限
umask o-wx
# 赋值权限:
# 赋值全部用户所有权限,等价于umask u=rwx,g=rwx,o=rwx
umask a=rwx
# 清除其他用户的读、写、执行权限。
umask o=

创建文件夹、文件(假设当前目录不存在)

1
2
3
4
5
6
7
8
# 创建文件
touch test.sh
# 查看权限,发现执行权限的设置不起作用。
stat test.sh
# 创建文件夹
touch newdir
# 查看权限,发现执行权限的设置可以起作用。
stat newdir

注意

  1. 该命令是bash内建命令,相关的帮助信息请查看help命令。

  2. chmod用于更改已有对象的权限,umask影响之后新建对象的权限。

  3. 请谨慎使用该命令,特别是不要取消当前用户的读取权限,那样会导致你在终端使用TAB键补全时报错。

umount

用于卸载已经加载的文件系统

umount命令 用于卸载已经加载的文件系统。利用设备名或挂载点都能umount文件系统,不过最好还是通过挂载点卸载,以免使用绑定挂载(一个设备,多个挂载点)时产生混乱。

语法

1
umount(选项)(参数)

选项

1
2
3
4
5
6
7
-a:卸除/etc/mtab中记录的所有文件系统;
-h:显示帮助;
-n:卸除时不要将信息存入/etc/mtab文件中;
-r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统;
-t<文件系统类型>:仅卸除选项中所指定的文件系统;
-v:执行时显示详细的信息;
-V:显示版本信息。

参数

文件系统:指定要卸载的文件系统或者其对应的设备文件名。

实例

下面两条命令分别通过设备名和挂载点卸载文件系统,同时输出详细信息:

通过设备名卸载

1
2
umount -v /dev/sda1
/dev/sda1 umounted

通过挂载点卸载

1
2
umount -v /mnt/mymount/
/tmp/diskboot.img umounted

如果设备正忙,卸载即告失败。卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录:

1
2
3
umount -v /mnt/mymount/
umount: /mnt/mymount: device is busy
umount: /mnt/mymount: device is busy

有时,导致设备忙的原因并不好找。碰到这种情况时,可以用lsof列出已打开文件,然后搜索列表查找待卸载的挂载点:

1
2
lsof | grep mymount         查找mymount分区里打开的文件
bash 9341 francois cwd DIR 8,1 1024 2 /mnt/mymount

从上面的输出可知,mymount分区无法卸载的原因在于,francois运行的PID为9341的bash进程。

对付系统文件正忙的另一种方法是执行延迟卸载:

1
umount -vl /mnt/mymount/     执行延迟卸载

延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等到设备不再繁忙时才清理所有相关资源。卸载可移动存储介质还可以用eject命令。下面这条命令会卸载cd并弹出CD:

1
eject /dev/cdrom      卸载并弹出CD 

uname

打印系统信息

1
uname [OPTION]...

主要用途

  • 打印机器和操作系统的信息。
  • 当没有选项时,默认启用 -s 选项。
  • 如果给出多个选项或 -a 选项时,输出信息按以下字段排序:内核名称 主机名称 内核 release 内核版本
    机器名称 处理器 硬件平台 操作系统。

选项

-a, --all
显示所有的信息, 按顺序打印,如果 -p 和 -i 的信息是未知,那么省略

-i, --hardware-platform

打印硬件平台名称

-m, --machine

显示机器(硬件)类型

-n, --nodename

显示机器的网络节点主机名

-r, --release, --kernel-release
显示操作系统发行版本

-s, --sysname, --kernel-name

显示操作系统名, 打印内核名称

-o, --operating-system

打印操作系统名称

-p, --processor

显示主机处理器(CPU)类型

-v, --kernel-version

显示操作系统版本, 打印内核版本

--help

显示本帮助并退出

--version

显示版本信息并退出

例子

1
2
3
# 单独使用uname命令时相当于uname -s
[root@localhost ~]# uname
Linux
1
2
3
# 查看全部信息
[root@localhost ~]# uname -a
Linux localhost 2.6.18-348.6.1.el5 #1 SMP Tue May 21 15:34:22 EDT 2013 i686 i686 i386 GNU/Linux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 分别列出信息
[root@localhost ~]# uname -m
i686

[root@localhost ~]# uname -n
localhost

[root@localhost ~]# uname -r
2.6.18-4-686

[root@localhost ~]# uname -s
Linux

[root@localhost ~]# uname -v
#1 SMP Tue May 21 15:34:22 EDT 2013

[root@localhost ~]# uname -p
i686

[root@localhost ~]# uname -i
i386

[root@localhost ~]# uname -o
GNU/Linux

注意

  1. 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 unameinfo coreutils 'uname invocation'

unlink

系统调用函数unlink去删除指定的文件

unlink命令 用于系统调用函数unlink去删除指定的文件。和rm命令作用一样,都是删除文件。

语法

1
unlink(选项)(参数)

选项

1
2
--help:显示帮助;
--version:显示版本号。

参数

文件:指定要删除的文件。

useradd - 添加新用户或者更新新用户的默认值

当不加-D 参数,useradd 指令使用命令列来指定新帐号的设定值并且使用系统上的预设值.新使用者帐号将产生一些系统档案,使用者目录建立,拷备起始档案等,这些均可以利用命令列选项指定。[此版本为 RedHatLinux 提供,可帮每个新加入的使用者建立个别的 group,毋须添加-n 选项]

useradd 命令 用于 Linux 中创建的新的系统用户。useradd 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码.而可用 userdel 删除帐号。使用 useradd 指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

在 Slackware 中,adduser 指令是个 script 程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的 useradd 命令建立新用户,如此可方便管理员建立用户帐号。在 Red Hat Linux 中, adduser 命令 则是 useradd 命令的符号连接,两者实际上是同一个指令。

1
2
3
useradd [options] LOGIN
useradd -D
useradd -D [options]

选项 & 参数

-c, --comment COMMENT

新帐号 password 档的说明栏, 任意字符串, 生成一个登陆的简短描述并且被当做用户的全名字段来使用

-b, --base-dir BASE_DIR

如果 -d 没有指定, 这个默认文件夹将是系统默认的基准文件夹, BASE_DIR 是定义用户 home 目录的文件目录, 如果此目录不存在, 否则用户的 home 目录不会被创建

-d, --home HOME_DIR

新帐号每次登入时所使用的 HOME_DIR。预设值为BASE_DIR内 login 名称,并当成登入时目录名称, HOME_DIR 的父级必须存在, 否则目录不会给创建

-e, --expiredate EXPIRE_DATE

帐号终止日期。日期的指定格式为 YYYY-MM-DD

-f, --inactive INACTIVE

用户密码过期之后几日内禁用, 当值为 0 时帐号则立即过期。而当值为-1 时则关闭此功能,预设值为-1

-g, --gid GROUP

用户初始登陆时候的组名或者组 id, 组必须存在, 群组数字也须为现有存在的群组

-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]

定义此使用者为此一堆 groups 的成员。每个群组使用,区格开来,不可以夹杂空白字符。群组名同-g 选项的限制。定义值为使用者的起始群组。

-h, --help

显示帮助信息

-M

用户的 Home 目录将不会被创建, 只有在/etc/login.defs系统设定中的才会创建目录

-m, --create-home

使用者目录如不存在则自动建立。如使用-k 选项 SKEL_DIR 内的档案将复制至使用者目录下。否则的话 /etc/skel 目录下的档案会复制过去取代。任何在 SKEL_DIR, /etc/skel 的目录也相同会在使用者目录下一一建立。-k选项必须和-m 选项同时使用, 不建立目录以及不复制任何档案为预设值。

-l

不向用户登陆的日志文件中填写信息, 仅仅[Red Hat]

-n

默认创建用户的时候将创建一个和用户相同名称的组, 这个选项关闭这个行为, 当这个选项使用的时候, 用户必须指定一个组
When this option is used, users by default will be placed in whatever group is specified in /etc/default/useradd. If no default group is defined, group 1 will be used.

-K, --key KEY=VALUE

覆盖 /etc/login.defs 默认值 (UID_MIN, UID_MAX, UMASK, PASS_MAX_DAYS and others).
例如: -K PASS_MAX_DAYS=-1 在创建系统账户时候关闭密码过期. 及时系统账号没有密码.
支持多值设定
-K UID_MIN=100 -K UID_MAX=499
Note: -K UID_MIN=10,UID_MAX=499 将不合法

-o, --non-unique

允许使用重复的 (非唯一) UID 创建用户

-p, --password PASSWORD

加密的密码, 使用 crypt(3) 返回, 默认是禁用账户

-r

This flag is used to create a system account. That is, a user with a UID lower than the value of UID_MIN defined in /etc/login.defs and whose password does not expire. Note that useradd will not create a home directory for such an user, regardless of the default setting in /etc/login.defs. You have to specify -m option if you want a home directory for a system account to be created. This is an option added by Red Hat

-s, --shell SHELL

使用者登入后使用的 shell 名称, 默认留空, 让系统选择默认的 shell, 例如 -s /sbin/nologin 是不允许登陆

-u, --uid UID

用户的 ID 值。必须为唯一的 ID 值,除非用-o选项。数字不可为负值。预设为最小不得小于 UID_MIN 而逐次增加。0~`UID_MIN`传统上是保留给系统帐号使用。

-Z, --selinux-user SEUSER

The SELinux user for the user’s login. The default is to leave this
field blank, which causes the system to select the default SELinux
user.

改变默认值
当使用 -D 选项, useradd 将显示默认的当前值, 或者使用命令行更新当前值, 可用选项如下

-b HOME_DIR

定义使用者所属目录的父目录。使用者名称会附加在 HOME_DIR 后面用来建立新使用者的目录。使用-d 后则此选项无效。

-e EXPIRE_DATE

使用者帐号过期日期

-f INACTIVE

帐号过期几日后停权

-g, --gid GROUP

新帐号起始群组名或 ID。群组名须为现有存在的名称。群组 ID 也须为现有存在的群组。

-s, --shell SHELL

使用者登入后使用的 shell 名称。往后新加入的帐号都将使用此 shell.

如不指定任何参数,useradd 显示目前预设的值

备注

/etc/skel/ 目录下的文件将会覆盖默认的用户文件
The system administrator is responsible for placing the default user files in the /etc/skel/ directory.
This version of useradd was modified by Red Hat to suit Red Hat user/group conventions.

涉及到的文件

1
2
3
4
5
6
7
/etc/passwd             #User account information.
/etc/shadow #Secure user account information.
/etc/group #Group account information.
/etc/gshadow #Secure group account information.
/etc/default/useradd #Default values for account creation.
/etc/skel/ #Directory containing default files.
/etc/login.defs #Shadow password suite configuration.

退出值

The useradd command exits with the following values:

1
2
3
4
5
6
7
8
9
10
0  success
1 can't update password file
2 invalid command syntax
3 invalid argument to option
4 UID already in use (and no -o)
6 specified group doesn't exist
9 username already in use
10 can't update group file
12 can't create home directory
13 can't create mail spool

实例

新建用户加入组:

1
useradd –g sales jack –G company,employees    //-g:加入主要组、-G:加入次要组

建立一个新用户账户,并设置 ID:

1
useradd duoli -u 544

需要说明的是,设定 ID 值时尽量要大于 500,以免冲突。因为 Linux 安装后会建立一些特殊用户,一般 0 到 499 之间的值留给 bin、mail 这样的系统账号。

wait

等待进程执行完后返回

wait命令 用来等待指令的指令,直到其执行完毕后返回终端。该指令常用于shell脚本编程中,待指定的指令执行完成后,才会继续执行后面的任务。该指令等待作业时,在作业标识号前必须添加备份号”%”。

语法

1
wait(参数)

参数

进程或作业标示:指定进程号或者作业号。

实例

使用命令wait等待作业号为1的作业完成后再返回,输入如下命令:

1
wait %1       #等待作业号为3的作业完成 

执行上面的指令后,将输出指定作业号的指令,如下所示:

1
find / -name password

write

向指定登录用户终端上发送信息

write命令 用于向指定登录用户终端上发送信息。通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方。如果接收信息的用户不只登入本地主机一次,你可以指定接收信息的终端机编号。

语法

1
write(参数)

参数

1
2
用户:指定要接受信息的登录用户;
登陆终端:指定接收信息的用户的登录终端。

实例

传信息给Rollaend,此时Rollaend只有一个连线 : 

1
write Rollaend

接下来就是将信息打上去,结束请Ctrl+C:

传信息给Rollaend、Rollaend的连线有pts/2、pts/3:

1
write Rollaend pts/2

接下来就是将信息打上去,结束请Ctrl+C:

若对方设定mesg n,则此时信息将无法传给对方。

kill

发送信号到进程。

目录

内建命令

概要

1
2
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
kill -l [sigspec]

主要用途

  • 发送信号到作业或进程(可以为多个)。
  • 列出信号。

选项

1
2
3
4
-s sig    信号名称。
-n sig 信号名称对应的数字。
-l 列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。
-L 等价于-l选项。

参数

pid:进程ID

jobspec:作业标识符

返回值

返回状态为成功除非给出了非法选项、执行出现错误。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[user2@pc] kill -l 9
KILL

# 列出所有信号名称:
[user2@pc] kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

# 下面是常用的信号。
# 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。

HUP 1 终端挂断
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
KILL 9 强制终止
TERM 15 终止
CONT 18 继续(与STOP相反,fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 以下发送KILL信号的形式等价。当然还有更多的等价形式,在此不一一列举了。
[user2@pc] kill -s SIGKILL PID
[user2@pc] kill -s KILL PID
[user2@pc] kill -n 9 PID
[user2@pc] kill -9 PID

[user2@pc] sleep 90 &
[1] 178420

# 终止作业标识符为1的作业。
[user2@pc] kill -9 %1

[user2@pc] jobs -l
[1]+ 178420 KILLED ssh 192.168.1.4

[user2@pc] sleep 90 &
[1] 181357

# 发送停止信号。
[user2@pc] kill -s STOP 181357

[user2@pc] jobs -l
[1]+ 181537 Stopped (signal) sleep 90

# 发送继续信号。
[user2@pc] kill -s CONT 181357

[user2@pc] jobs -l
[1]+ 181537 Running sleep 90 &

注意

  1. bash的作业控制命令包括bg fg kill wait disown suspend
  2. 该命令是bash内建命令,相关的帮助信息请查看help命令。

外部命令

概要

1
2
kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
kill -l [number] | -L

主要用途

  • 发送信号到进程(可以为多个)。

  • 列出信号。

选项

1
2
3
4
5
6
7
8
9
10
11
-s, --signal signal    要发送的信号,可能是信号名称或信号对应的数字。
-l, --list [number] 打印信号名称或转换给定数字到信号名称。信号名称可参考文件(/usr/include/linux/signal.h)。
-L, --table 和'-l'选项类似,但是输出信号名称以及信号对应的数字。
-a, --all 不要限制“命令名到pid”的转换为具有与当前进程相同的UID的进程。
-p, --pid 打印目标进程的PID而不发送信号。
--verbose 打印信号以及接收信号的PID。
-q, --queue value 使用sigqueue(3)而不是kill(2)。参数value是信号对应的数字。
如果接收进程已为此信号安装了处理程序将SA_SIGINFO标记为sigaction(2),则可以获取
该数据通过siginfo_t结构的si_sigval字段。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。

参数

接收信号的进程列表可以是PID以及name的混合组成。

PID:每一个PID可以是以下四种情况之一:

状态 说明
n 当n大于0时,PID为n的进程接收信号。
0 当前进程组中的所有进程均接收信号。
-1 PID大于1的所有进程均接收信号。
-n 当n大于1时,进程组n中的所有进程接收信号。当给出了一个参数的形式为“-n”,想要让它表示一个进程组,那么必须首先指定一个信号,或参数前必须有一个“–”选项,否则它将被视为发送的信号。

name:使用此名称调用的所有进程将接收信号。

例子

1
2
3
4
5
> sleep 20 &

# 列出对应的PID。
> kill -p sleep
23021

返回值

  • 0 成功。
  • 1 失败。
  • 64 部分成功(当指定了多个进程时)。

注意

  1. 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 killinfo coreutils 'kill invocation'
  2. 启动或关闭内建命令请查看enable命令,关于同名优先级的问题请查看builtin命令的例子部分的相关讨论。
  3. kill命令类似的有xkillpkill,killall等,用于不同的目的和场景。

参考链接

发送信号到进程

lsof - 显示 Linux 系统当前已打开的所有文件列表

lsof 命令 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。
lsof -p pid

lsof(list open files)是一个查看当前系统文件的工具。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息, 因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof 打开的文件可以是:

  1. 普通文件
  2. 目录
  3. 网络文件系统的文件
  4. 字符或设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 网络文件(例如:NFS file、网络 socket,unix 域名 socket)
  9. 还有其它类型的文件,等等
1
lsof(选项)

选项 & 参数

1
2
3
4
5
6
7
8
9
10
11
12
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

实例

实例 1:无任何参数

1
2
3
4
5
6
7
8
9
10
$lsof| more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 253,0 4096 2 /
init 1 root rtd DIR 253,0 4096 2 /
init 1 root txt REG 253,0 150352 1310795 /sbin/init
init 1 root mem REG 253,0 65928 5505054 /lib64/libnss_files-2.12.so
init 1 root mem REG 253,0 1918016 5521405 /lib64/libc-2.12.so
init 1 root mem REG 253,0 93224 5521440 /lib64/libgcc_s-4.4.6-20120305.so.1
init 1 root mem REG 253,0 47064 5521407 /lib64/librt-2.12.so
init 1 root mem REG 253,0 145720 5521406 /lib64/libpthread-2.12.so

说明:

lsof 输出各列信息的意义如下:

  • COMMAND:进程的名称
  • PID:进程标识符
  • PPID:父进程标识符(需要指定-R 参数)
  • USER:进程所有者
  • PGID:进程所属组
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如 cwd、txt 等:

文件描述符列表

  • cwd:表示 current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
  • txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
  • lnn:library references (AIX);
  • er:FD information error (see NAME column);
  • jld:jail directory (FreeBSD);
  • ltx:shared library text (code and data);
  • mxx :hex memory-mapped type number xx.
  • m86:DOS Merge mapped file;
  • mem:memory-mapped file;
  • mmap:memory-mapped device;
  • pd:parent directory;
  • rtd:root directory;
  • tr:kernel trace file (OpenBSD);
  • v86 VP/ix mapped file;
  • 0:表示标准输入
  • 1:表示标准输出
  • 2:表示标准错误

文件状态

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u 等

  • u:表示该文件被打开并处于读取/写入模式
  • r:表示该文件被打开并处于只读模式
  • w:表示该文件被打开并处于
  • 空格:表示该文件的状态模式为 unknow,且没有锁定
  • -:表示该文件的状态模式为 unknow,且被锁定

相关锁

同时在文件状态模式后面,还跟着相关的锁

  • N:for a Solaris NFS lock of unknown type;
  • r:for read lock on part of the file;
  • R:for a read lock on the entire file;
  • w:for a write lock on part of the file;(文件的部分写锁)
  • W:for a write lock on the entire file;(整个文件的写锁)
  • u:for a read and write lock of any length;
  • U:for a lock of unknown type;
  • x:for an SCO OpenServer Xenix lock on part of the file;
  • X:for an SCO OpenServer Xenix lock on the entire file;
  • space:if there is no lock.

文件类型

TYPE:文件类型,如 DIR、REG 等,常见的文件类型:

  • DIR:表示目录
  • CHR:表示字符类型
  • BLK:块设备类型
  • UNIX: UNIX 域套接字
  • FIFO:先进先出 (FIFO) 队列
  • IPv4:网际协议 (IP) 套接字
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

实例 2:查找某个文件相关的进程

1
$ lsof $filename
1
2
3
4
5
$ lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 2169 root txt REG 253,0 938736 4587562 /bin/bash
ksmtuned 2334 root txt REG 253,0 938736 4587562 /bin/bash
bash 20121 root txt REG 253,0 938736 4587562 /bin/bash

实例 3:列出某个用户打开的文件信息

1
$lsof -u username

-u 选项,u 是 user 的缩写

实例 4:列出某个程序进程所打开的文件信息

1
$lsof -c mysql

-c 选项将会列出所有以 mysql 这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符;

实例 5:列出某个用户以及某个进程所打开的文件信息

1
$lsof  -u test -c mysql

实例 6:通过某个进程号显示该进程打开的文件

1
$lsof -p 11968

实例 7:列出所有的网络连接

1
$lsof -i

实例 8:列出所有 tcp 网络连接信息

1
2
3
4
5
6
$lsof -i tcp

$lsof -n -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
svnserve 11552 weber 3u IPv4 3799399 0t0 TCP *:svn (LISTEN)
redis-ser 25501 weber 4u IPv4 113150 0t0 TCP 127.0.0.1:6379 (LISTEN)

实例 9:列出谁在使用某个端口

1
$lsof -i :3306

实例 10:列出某个用户的所有活跃的网络端口

1
$lsof -a -u test -i

实例 11:根据文件描述列出对应的文件信息

1
$lsof -d description(like 2)

示例:

1
2
$lsof -d 3 | grep PARSER1
tail 6499 tde 3r REG 253,3 4514722 417798 /opt/applog/open/log/HOSTPARSER1_ERROR_141217.log.001

说明: 0 表示标准输入,1 表示标准输出,2 表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

实例 12:列出被进程号为 1234 的进程所打开的所有 IPV4 network files

1
$lsof -i 4 -a -p 1234

实例 13:列出目前连接主机 nf5260i5-td 上端口为:20,21,80 相关的所有文件信息,且每隔 3 秒重复执行

1
lsof -i @nf5260i5-td:20,21,80 -r 3

mkdir

用来创建目录

mkdir命令 用来创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录。在创建目录时,应保证新建的目录与它所在目录下的文件没有重名。 

注意:在创建文件时,不要把所有的文件都存放在主目录中,可以创建子目录,通过它们来更有效地组织文件。最好采用前后一致的命名方式来区分文件和目录。例如,目录名可以以大写字母开头,这样,在目录列表中目录名就出现在前面。

在一个子目录中应包含类型相似或用途相近的文件。例如,应建立一个子目录,它包含所有的数据库文件,另有一个子目录应包含电子表格文件,还有一个子目录应包含文字处理文档,等等。目录也是文件,它们和普通文件一样遵循相同的命名规则,并且利用全路径可以唯一地指定一个目录。

语法

1
mkdir (选项)(参数)

选项

1
2
3
4
-Z:设置安全上下文,当使用SELinux时有效;
-m<目标属性>或--mode<目标属性>建立目录的同时设置目录的权限;
-p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
--version 显示版本信息。

参数

目录:指定要创建的目录列表,多个目录之间用空格隔开。

实例

在目录/usr/meng下建立子目录test,并且只有文件主有读、写和执行权限,其他人无权访问

1
mkdir -m 700 /usr/meng/test

在当前目录中建立bin和bin下的os_1目录,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问

1
mkdir -p-m 750 bin/os_1

mknod

创建字符设备文件和块设备文件

mknod命令 用于创建Linux中的字符设备文件和块设备文件。

语法

1
mknod(选项)(参数)

选项

1
2
3
4
-Z:设置安全的上下文;
-m:设置权限模式;
-help:显示帮助信息;
--version:显示版本信息。

参数

  • 文件名:要创建的设备文件名;
  • 类型:指定要创建的设备文件的类型;
  • 主设备号:指定设备文件的主设备号;
  • 次设备号:指定设备文件的次设备号。

实例

1
2
3
ls -la /dev/ttyUSB*
crw-rw—- 1 root dialout 188, 0 2008-02-13 18:32 /dev/ttyUSB0
mknod /dev/ttyUSB32 c 188 32

扩展知识

Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录 下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。

为了管理这些设备,系统为设备编了号,每 个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编 号,如硬盘的主设备号是3。

Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设 的种类较多,操作方式各不相同。Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。

打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。

mount

用于挂载Linux系统外的文件

mount命令 Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。

语法

1
2
3
4
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-V:显示程序版本
-h:显示辅助讯息
-v:显示较讯息,通常和 -f 用来除错。
-a:将 /etc/fstab 中定义的所有档案系统挂上。
-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
-s-r:等于 -o ro
-w:等于 -o rw
-L:将含有特定标签的硬盘分割挂上。
-U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
-t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
-o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
-o sync:在同步模式下执行。
-o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
-o auto、-o noauto:打开/关闭自动挂上模式。
-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
-o dev、-o nodev-o exec、-o noexec允许执行档被执行。
-o suid、-o nosuid:
允许执行档在 root 权限下执行。
-o user、-o nouser:使用者可以执行 mount/umount 的动作。
-o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
-o ro:用唯读模式挂上。
-o rw:用可读写模式挂上。
-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

实例

/dev/hda1 挂在 /mnt 之下。

1
#mount /dev/hda1 /mnt

/dev/hda1 用唯读模式挂在 /mnt 之下。

1
#mount -o ro /dev/hda1 /mnt

/tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在 /mnt/cdrom 之下。用这种方法可以将一般网络上可以找到的 Linux 光 碟 ISO 档在不烧录成光碟的情况下检视其内容。

1
#mount -o loop /tmp/image.iso /mnt/cdrom

nice

改变程序执行的优先权等级

nice命令 用于以指定的进程调度优先级启动其他的程序。

语法

1
nice(选项)(参数)

选项

1
-n:指定进程的优先级(整数)。

参数

指令及选项:需要运行的指令及其他选项。

实例

新建一个进程并设置优先级,将当前目录下的documents目录打包,但不希望tar占用太多CPU:

1
nice -19 tar zcf pack.tar.gz documents

方法非常简单,即在原命令前加上nice -19。很多人可能有疑问了,最低优先级不是19么?那是因为这个“-19”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:

1
nice --19 tar zcf pack.tar.gz documents

read

从键盘读取变量值

read命令 从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY

语法

1
read(选项)(参数)

选项

1
2
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。

参数

变量:指定读取值的变量名。

实例

下面的列表给出了read命令的常用方式:

1
2
read 1987name
从标准输入读取输入并赋值给变量1987name。
1
2
read first last
从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。
1
2
read
从标准输入读取一行并赋值给特定变量REPLY。
1
2
read -a arrayname
把单词清单读入arrayname的数组里。
1
2
read -p "text"
打印提示(text),等待输入,并将输入存储在REPLY中。
1
2
read -r line
允许输入包含反斜杠。
1
2
read -t 3
指定读取等待时间为3秒。
1
2
read -n 2 var
从输入中读取两个字符并存入变量var,不需要按回车读取。
1
2
read -d ":" var
用定界符“:”结束输入行。

read命令示例

从标准输入读取输入并赋值给变量1987name。

1
2
3
4
5
#read 1987name        #等待读取输入,直到回车后表示输入完毕,并将输入赋值给变量answer
HelloWorld #控制台输入Hello

#echo $1987name #打印变量
HelloWorld

等待一组输入,每个单词之间使用空格隔开,直到回车结束,并分别将单词依次赋值给这三个读入变量。

1
2
3
4
5
#read one two three
1 2 3 #在控制台输入1 2 3,它们之间用空格隔开。

#echo "one = $one, two = $two, three = $three"
one = 1, two = 2, three = 3

REPLY示例

1
2
3
4
5
6
#read                  #等待控制台输入,并将结果赋值给特定内置变量REPLY。
This is REPLY #在控制台输入该行。

#echo $REPLY #打印输出特定内置变量REPLY,以确认是否被正确赋值。

This is REPLY

-p选项示例

1
2
3
4
5
#read -p "Enter your name: "            #输出文本提示,同时等待输入,并将结果赋值给REPLY。
Enter you name: stephen #在提示文本之后输入stephen

#echo $REPLY
stephen

等待控制台输入,并将输入信息视为数组,赋值给数组变量friends,输入信息用空格隔开数组的每个元素。

1
2
3
4
5
#read -a friends
Tim Tom Helen

#echo "They are ${friends[0]}, ${friends[1]} and ${friends[2]}."
They are Tim, Tom and Helen.

补充一个终端输入密码时候,不让密码显示出来的例子。

方法1:

1
2
3
4
#!/bin/bash
read -p "输入密码:" -s pwd
echo
echo password read, is "$pwd"

方法2:

1
2
3
4
5
6
#!/bin/bash
stty -echo
read -p "输入密码:" pwd
stty echo
echo
echo 输入完毕。

其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。

使用read命令从键盘读取变量值,并且将值赋给指定的变量,输入如下命令:

1
read v1 v3          #读取变量值

执行上面的指令以后,要求键入两个数据,如下所示:

1
Linux c+            #输入数据

完成之后,可以使用echo命令将指定的变量值输出查看,输入如下命令:

1
echo $v1 $v3       #输出变量的值

执行输出变量值的命令以后,将显示用户所输入的数据值,如下所示:

1
Linux c+           #输出变量值

注意:使用echo命令输出变量值时,必须在变量名前添加符号$。否则,echo将直接输出变量名。

reboot

重新启动正在运行的Linux操作系统

reboot命令 用来重新启动正在运行的Linux操作系统。

语法

1
reboot(选项)

选项

1
2
3
4
5
-d:重新开机时不把数据写入记录文件/var/tmp/wtmp。本参数具有“-n”参数效果;
-f:强制重新开机,不调用shutdown指令的功能;
-i:在重开机之前,先关闭所有网络界面;
-n:重开机之前不检查是否有未结束的程序;
-w:仅做测试,并不真正将系统重新开机,只会把重开机的数据写入/var/log目录下的wtmp记录文件。

实例

1
2
reboot        //重开机。
reboot -w //做个重开机的模拟(只有纪录并不会真的重开机)。

rename

用字符串替换的方式批量改变文件名

rename命令 用字符串替换的方式批量改变文件名。

语法

1
rename(参数)

参数

1
2
3
原字符串:将文件名需要替换的字符串;
目标字符串:将文件名中含有的原字符替换成目标字符串;
文件:指定要改变文件名的文件列表。

实例

将main1.c重命名为main.c

1
rename main1.c main.c main1.c

rename支持通配符

1
2
3
?  可替代单个字符
* 可替代多个字符
[charset] 可替代charset集中的任意单个字符

文件夹中有这些文件foo1, …, foo9, foo10, …, foo278

如果使用rename foo foo0 foo?,会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0。

如果使用rename foo foo0 foo??,foo01到foo99的所有文件都被重命名为foo001到foo099,只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0。

如果使用rename foo foo0 foo*,foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名。

如果使用rename foo0 foo foo0[2]*,从foo0200到foo0278的所有文件都被重命名为foo200到foo278,文件名中的foo0被替换为foo。

rename支持正则表达式

字母的替换

1
rename "s/AA/aa/" *  # 把文件名中的AA替换成aa

修改文件的后缀

1
rename "s//.html//.php/" *     # 把.html 后缀的改成 .php后缀

批量添加文件后缀

1
rename "s/$//.txt/" *  # 把所有的文件名都以txt结尾

批量删除文件名

1
rename "s//.txt//" *   # 把所有以.txt结尾的文件名的.txt删掉

rmdir

用来删除空目录

rmdir命令 用来删除空目录。当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录。利用rmdir命令可以从一个目录中删除一个或多个空的子目录。该命令从一个目录中删除一个或多个子目录,其中dirname佬表示目录名。如果dirname中没有指定路径,则删除当前目录下由dirname指定的目录;如dirname中包含路径,则删除指定位置的目录。删除目录时,必须具有对其父目录的写权限。

注意:子目录被删除之前应该是空目录。就是说,该目录中的所有文件必须用rm命令全部,另外,当前工作目录必须在被删除目录之上,不能是被删除目录本身,也不能是被删除目录的子目录。

虽然还可以用带有-r选项的rm命令递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性。

语法

1
rmdir(选项)(参数)

选项

1
2
3
4
5
-p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;
--ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息;
-v或-verboes:显示命令的详细执行过程;
--help:显示命令的帮助信息;
--version:显示命令的版本信息。

参数

目录列表:要删除的空目录列表。当删除多个空目录时,目录名之间使用空格隔开。

实例

将工作目录下,名为 www 的子目录删除 :

1
rmdir www

在工作目录下的 www 目录中,删除名为 Test 的子目录。若 Test 删除后,www 目录成为空目录,则 www 亦予删除。

1
rmdir -p www/Test

下面命令等价于 rmdir a/b/c, rmdir a/b, rmdir a

1
rmdir -p a/b/c

setsid

在新的会话中运行程序

setsid命令 子进程从父进程继承了:SessionID、进程组ID和打开的终端。子进程如果要脱离这些,代码中可通过调用setsid来实现。,而命令行或脚本中可以通过使用命令setsid来运行程序实现。setsid帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程组和隶属的会话。

语法

1
setsid[options] <program> [arguments ...]

选项

1
2
3
-c, --ctty   将控制终端设置为当前控制终端
-f, --fork 总是 fork
-w, --wait 等待程序退出,并使用相同的返回

实例

可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可

1
2
3
4
5
[root@root ~]# setsid ping www.ibm.com
[root@root ~]# ps -ef |grep www.ibm.com
root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com
[root@root ~]#

shutdown

用来执行系统关机的命令

shutdown命令 用来系统关机命令。shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作。

shutdown 以一种安全的方式关闭系统。所有登陆用户都可以看到关机信息提示,并且 login(1) 将被阻塞。可以指定立刻关机,也可以指定系统在一定的延时后关机。所有进程都将接收到 SIGTERM 信号。这可以使 vi(1) 等程序有时间将处于编辑状态的文件进行存储,邮件和新闻程序进程则可以将所有缓冲池内的数据进行适当的清除等等。 shutdown 通过通知 init 进程,要求它改换运行级别来实现。运行级别 0 用来关闭系统,运行级别 6 用来重启系统,运行级别 1 用来使系统进入执行系统管理任务状态,如果没有给出 -h 或 -r 标志时,这是 shutdown 命令的默认工作状态。具体关机或重启所执行的操作请查阅 /etc/inittab 文件中相应的运行级别栏。

语法

1
/sbin/shutdown [-t sec] [-arkhncfFHP] time [warning-message]

选项

-a
使用 /etc/shutdown.allow 来验证身份。
-t <sec>
通知 init(8) 在转换到其它运行级别前,发送警告 (warning) 信号后延时 (sec) 秒数后再发送关闭 (kill) 信号。
-k
并非真正关机,只向所有人显示警告信息。
-r
重启。

-h
停机。

-n
[DEPRECATED] 不调用 init(8) 程序进行关机操作,而由自己进行。不建议用户使用这种关机方式,它的结果一般也不是你希望的那样。
-f
重启时跳过磁盘检测。
-F
重启时强制磁盘检测。
-c
取消运行中的 shutdown 进程。不可能为此选项指定 time 参数,但你可以在命令行输入一条解释消息来向所有用户说明。(一般的shutdown指令可以用按“+”号来进行中断)

参数

time
关机时间。
warning-message
发送给所有用户的消息。

time 参数的格式可以有很多种。首先,可以是 hh:mm 格式的绝对时间,其中 hh 指的是小时(一到二位数),mm 指的是分钟(二位数)。第二种是 +m 格式,其中 m 指的是等待的分钟数。 now 是 +0 的别名。

如果 shutdown 在调用时使用了延时,它将自动创建一个咨询 (advisory) 文件 /etc/nologin ,作用是禁止 login(1) 允许新用户登陆,除非 shutdown 在向 init 发信号前意外中止 (就是说,它被取消或出了什么问题)。它会在调用 init 改变运行级之前删除这个文件。

-f 标志意味着 ‘快速重启’。这将创建一个咨询 (advisory) 文件 /fastboot ,此文件在系统重启时会被检测到。启动脚本 rc 会检测是否存在这样的文件,如果有,就不会再运行 fsck(1),因为系统是以正常方式关闭的。这之后,启动进程会删除 /fastboot。

-F 标志意味着 ‘强制 fsck’。这将创建一个咨询 (advisory) 文件 /forcefsck,此文件在系统重启时会被检测到。启动脚本 rc 会检测是否存在这个文件,如果有,就运行 fsck(1) 并且加上一个特殊的 ‘force’ 标志,以使得即使正常卸载的文件系统也被检查。这之后,启动进程会删除 /forcefsck。

-n 标志导致 shutdown 不调用 init 程序进行关机,而是自己关闭所有运行中的进程。shutdown 接下来会关闭配额 (quota),记账 (accounting) 和交换分区,卸载所有文件系统。

ACCESS CONTROL

如果在 /etc/inittab 文件中有适当的条目,当按下特殊键 CTRL-ALT-DEL 时,shutdown 可以被 init(8) 调用。这意味着可以物理地接触到终端键盘的任何人都可以关闭系统。要避免这种行为,shutdown 可以检测是否有授权的用户登录到了虚拟终端之一。如果 shutdown 在调用时带有 -a 参数 (可以将它添加到 /etc/inittab 中 shutdown 的执行命令之后),它将检测是否存在 /etc/shutdown.allow 文件。接下来它比较文件中的登录名与虚拟终端的登录用户列表 (在/var/run/utmp)。只有当授权的用户之一 或者 root 登录了,它才会继续。否则,它会把信息
shutdown: no authorized users logged in
写到 (物理的) 系统终端。/etc/shutdown.allow 的格式是每行一个用户名。允许出现空行和注释行 (以 # 开头)。此文件当前有最多 32 个用户的限制。

注意,如果 /etc/shutdown.allow 不存在,-a 参数将被忽略。

实例

指定现在立即关机:

1
shutdown -h now

指定5分钟后关机,同时送出警告信息给登入用户:

1
shutdown +5 "System will shutdown after 5 minutes"

FILES

1
2
3
4
5
/fastboot
/etc/inittab
/etc/init.d/halt
/etc/init.d/reboot
/etc/shutdown.allow

NOTES

很多用户忘记了传递 time 参数,结果被 shutdown 产生的错误消息所迷惑。time 参数是必须的,90% 的情况下这个参数会是 now。

Init 只能在终端模式捕获 CTRL-ALT-DEL 并且启动 shutdown。如果系统正在运行 X window System,X 服务器处理所有的按键。一些 X11 环境使得捕获 CTRL-ALT-DEL 成为可能,但是这个事件究竟做了什么依赖于那个环境。

Shutdown 没有被设计为使用 setuid。/etc/shutdown.allow 不用来找出谁在执行 shutdown ,它用来检查当前在终端 (之一) 登录的用户。

SEE ALSO

fsck(8), init(8), halt(8), poweroff(8), reboot(8)

stat

用于显示文件的状态信息

stat命令 用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。

语法

1
stat(选项)(参数)

选项

1
2
3
4
5
-L:支持符号连接;
-f:显示文件系统状态而非文件状态;
-t:以简洁方式输出信息;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。

参数

文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# ls -l myfile
-rw-r--r-- 1 root root 0 2010-10-09 myfile

[root@localhost ~]# stat myfile
file: “myfile”
Size: 0 Blocks: 8 IO Block: 4096 一般空文件
Device: fd00h/64768d Inode: 194805815 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-12-12 12:22:35.000000000 +0800
Modify: 2010-10-09 20:44:21.000000000 +0800
Change: 2010-10-09 20:44:21.000000000 +0800

[root@localhost ~]# stat -f myfile
File: "myfile"
id: 0 Namelen: 255 type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 241555461 free: 232910771 Available: 220442547
Inodes: Total: 249364480 Free: 249139691

[root@localhost ~]# stat -t myfile
myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096

stty

修改终端命令行的相关设置

stty命令 修改终端命令行的相关设置。

语法

1
stty(选项)(参数)

选项

1
2
-a:以容易阅读的方式打印当前的所有配置;
-g:以stty可读方式打印当前的所有配置。

参数

终端设置:指定终端命令行的设置选项。

实例

在命令行下,禁止输出大写的方法:

1
2
stty iuclc     #开启
stty -iuclc #恢复

在命令行下禁止输出小写:

1
2
stty olcuc    #开启
stty -olcuc #恢复

打印出终端的行数和列数:

1
stty size

改变Ctrl+D的方法:

1
stty eof "string"

系统默认是Ctrl+D来表示文件的结束,而通过这种方法,可以改变!

屏蔽显示:

1
2
stty -echo   #禁止回显
stty echo #打开回显

测试方法:

1
stty -echo;read;stty echo;read

忽略回车符:

1
2
stty igncr     #开启
stty -igncr #恢复

定时输入:

1
2
3
4
5
6
7
8
timeout_read()
{
timeout=$1
old_stty_settings=`stty -g`  #save current settings
stty -icanon min 0 time 100  #set 10seconds,not 100seconds
eval read varname   #=read $varname
stty "$old_stty_settings"   #recover settings
}

更简单的方法就是利用read命令的-t选项:

1
read -t 10 varname

swapoff

关闭指定的交换空间

swapoff命令 用于关闭指定的交换空间(包括交换文件和交换分区)。swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。

语法

1
swapoff(选项)(参数)

选项

1
-a:关闭配置文件“/etc/fstab”中所有的交换空间。

参数

交换空间:指定需要激活的交换空间,可以是交换文件和交换分区,如果是交换分区则指定交换分区对应的设备文件。

实例

关闭交换分区

1
swapoff /dev/sda2

swapon

激活Linux系统中交换空间

swapon命令 用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存。

语法

1
swapon(选项)(参数)

选项

1
2
3
4
5
-a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;
-h:显示帮助;
-p<优先顺序>:指定交换区的优先顺序;
-s:显示交换区的使用状况;
-V:显示版本信息。

参数

交换空间:指定需要激活的交换空间,可以是交换文件和交换分区,如果是交换分区则指定交换分区对应的设备文件。

实例

1
2
3
4
5
6
mkswap -c /dev/hdb4 (-c是检查有无坏块)
swapon -v /dev/hdb4
swapon -s
Filename type Size Used Priority
/dev/hda5 partition 506008 96 -1
/dev/hdb4 partition 489972 0 -2

sync

用于强制被改变的内容立刻写入磁盘

sync命令 用于强制被改变的内容立刻写入磁盘,更新超块信息。

在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率。sync命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。用户通常不需执行sync命令,系统会自动执行update或bdflush操作,将缓冲区的数据写 入磁盘。只有在update或bdflush无法执行或用户需要非正常关机时,才需手动执行sync命令。

语法

1
sync(选项)

选项

1
2
--help:显示帮助;
--version:显示版本信息。

buffer与cache

  • buffer:为了解决写磁盘的效率
  • cache:为了解决读磁盘的效率

linux系统为了提高读写磁盘的效率,会先将数据放在一块buffer中。在写磁盘时并不是立即将数据写到磁盘中,而是先写入这块buffer中了。此时如果重启系统,就可能造成数据丢失。

sync命令用来flush文件系统buffer,这样数据才会真正的写到磁盘中,并且buffer才能够释放出来,flush就是用来清空buffer。sync命令会强制将数据写入磁盘中,并释放该数据对应的buffer,所以常常会在写磁盘后输入sync命令来将数据真正的写入磁盘。

如果不去手动的输入sync命令来真正的去写磁盘,linux系统也会周期性的去sync数据。

sysctl

时动态地修改内核的运行参数

sysctl命令 被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。

语法

1
sysctl(选项)(参数)

选项

1
2
3
4
5
6
7
-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。

参数

变量=值:设置内核参数对应的变量值。

实例

查看所有可读变量:

sysctl -a

读一个指定的变量,例如kern.maxproc

sysctl kern.maxproc kern.maxproc: 1044

要设置一个指定的变量,直接用variable=value这样的语法:

1
2
sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000

您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf看起来很像rc.conf。它用variable=value的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。

sysctl变量的设置通常是字符串、数字或者布尔型。(布尔型用 1 来表示’yes’,用 0 来表示’no’)。

1
2
3
4
5
6
7
8
9
10
11
12
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

如果该文件为空,则输入以下内容,否则请根据情况自己做调整:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 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

# 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 你的主机,则加入以下代码:

1
2
# Disable ping requests
net.ipv4.icmp_echo_ignore_all = 1

编辑完成后,请执行以下命令使变动立即生效:

1
2
/sbin/sysctl -p
/sbin/sysctl -w net.ipv4.route.flush=1

syslog

系统默认的日志守护进程

syslog 是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。

几乎所有的网络设备都可以通过syslog协议,将日志信息以用户数据报协议(UDP)方式传送到远端服务器,远端接收日志服务器必须通过syslogd监听UDP 端口514,并根据 syslog.conf配置文件中的配置处理本机,接收访问系统的日志信息,把指定的事件写入特定文件中,供后台数据库管理和响应之用。意味着可以让任何事件都登录到一台或多台服务器上,以备后台数据库用off-line(离线) 方法分析远端设备的事件。

通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。

使用方法

在/var/log中创建并写入日志信息是由syslog协议处理的,是由守护进程sylogd负责执行。每个标准的进程都可以用syslog记录日志。可以使用logger命令通过syslogd记录日志。

要向syslog文件/var/log/messages中记录日志信息:

1
2
3
4
5
logger this is a test log line

输出:
tail -n 1 messages
Jan 5 10:07:03 localhost root: this is a test log line

如果要记录特定的标记(tag)可以使用:

1
2
3
4
5
logger -t TAG this is a test log line

输出:
tail -n 1 messages
Jan 5 10:37:14 localhost TAG: this is a test log line

tee

从标准输入读取数据并重定向到标准输出和文件。

概要

1
tee [OPTION]... [FILE]...

主要用途

  • 需要同时查看数据内容并输出到文件时使用。

参数

FILE(可选):要输出的文件,可以为一或多个。

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
长选项与短选项等价

-a, --append 追加到文件中而不是覆盖。
-i, --ignore-interrupts 忽略中断信号(Ctrl+c中断操作无效)。
-p 诊断写入非管道的错误。
--output-error[=MODE] 设置写错误时的行为,请查看下方的MODE部分。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。

MODE决定了当出现写错误时的输出行为,可用的MODE如下:

'warn' 当写入到任何输出报错时诊断。
'warn-nopipe' 当写入到任何输出(而不是管道)报错时诊断。
'exit' 当写入到任何输出报错时退出。
'exit-nopipe' 当写入到任何输出(而不是管道)报错时退出。

-p选项的指定的默认MODE为'warn-nopipe'。
当'--output-error'没有在选项中时,默认的操作是当写入到管道报错时立刻退出,诊断错误信息并写入到非管道输出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

1
2
3
4
5
# 将进程信息通过管道输出到标准输出(终端)并覆盖写入到文件中。
ps -ef |tee info_a.log info_b.log

# 将进程信息通过管道输出到标准输出(终端)并追加写入到文件中。
ps -ef |tee -a info_a.log info_b.log

注意

  1. 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 teeinfo coreutils 'tee invocation'
  2. 存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。

time

统计给定命令所花费的总时间

time命令 用于统计给定命令所花费的总时间。

语法

1
time(参数)

参数

指令:指定需要运行的额指令及其参数。

实例

当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:

1
2
3
4
5
6
[root@localhost ~]# time ls
anaconda-ks.cfg install.log install.log.syslog satools text

real 0m0.009s
user 0m0.002s
sys 0m0.007s

输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。

  • real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
  • user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
  • sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。

shell内建也有一个time命令,当运行time时候是调用的系统内建命令,应为系统内建的功能有限,所以需要时间其他功能需要使用time命令可执行二进制文件/usr/bin/time

使用-o选项将执行时间写入到文件中:

1
/usr/bin/time -o outfile.txt ls

使用-a选项追加信息:

1
/usr/bin/time -a -o outfile.txt ls

使用-f选项格式化时间输出:

1
/usr/bin/time -f "time: %U" ls

-f选项后的参数:

参数 描述
%E real时间,显示格式为[小时:]分钟:秒
%U user时间。
%S sys时间。
%C 进行计时的命令名称和命令行参数。
%D 进程非共享数据区域,以KB为单位。
%x 命令退出状态。
%k 进程接收到的信号数量。
%w 进程被交换出主存的次数。
%Z 系统的页面大小,这是一个系统常量,不用系统中常量值也不同。
%P 进程所获取的CPU时间百分百,这个值等于 user+system 时间除以总共的运行时间。
%K 进程的平均总内存使用量(data+stack+text),单位是 KB
%w 进程主动进行上下文切换的次数,例如等待I/O操作完成。
%c 进程被迫进行上下文切换的次数(由于时间片到期)。

times

显示进程累计时间。

主要用途

  • 打印出shell及其子进程累计使用的用户时间和系统时间。

返回值

总是返回成功。

例子

1
2
3
4
5
6
7
8
# 执行命令
times
# 返回结果
0m0.037s 0m0.009s
0m0.010s 0m0.024s
# 根据times(2)的man手册,对应关系如下:
# 用户时间 | 系统时间
# 子进程的用户时间 | 子进程的系统时间

注意

  1. 该命令是bash内建命令,相关的帮助信息请查看help命令。

apt-sortpkgs

Debian Linux下对软件包索引文件进行排序的工具

apt-sortpkgs命令 是Debian Linux下对软件包索引文件进行排序的简单工具。

语法

1
apt-sortpkgs(选项)(参数)

选项

1
2
-s:使用源索引字段排序;
-h:显示帮助信息。

参数

文件:指定要排序的包含debian包信息的索引文件。