sleep

将目前动作延迟一段时间

补充说明

sleep命令 暂停指定的时间。

语法

1
sleep(参数)

参数

时间:指定要暂停时间的长度。

时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数。

实例

有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

b=''
for ((i=0;$i<=100;i++))
do
printf "Progress:[%-100s]%d%%\r" $b $i
sleep 0.1
b=#$b
done
echo

slabtop

实时显示内核slab内存缓存信息

补充说明

slabtop命令 以实时的方式显示内核“slab”缓冲区的细节信息。

语法

1
slabtop(选项)

选项

1
2
3
4
5
--delay=n, -d n:每n秒更新一次显示的信息,默认是每3秒;
--sort=S, -s S:指定排序标准进行排序(排序标准,参照下面或者man手册);
--once, -o:显示一次后退出;
--version, -V:显示版本;
--help:显示帮助信息。

排序标准:

  • a: sort by number of active objects
  • b: sort by objects per slab
  • c: sort by cache size
  • l: sort by number of slabs
  • v:sort by number of active slabs
  • n: sort by name
  • o: sort by number of objects
  • p: sort by pages per slab
  • s: sort by object size
  • u: sort by cache utilization

知识扩展

内核的模块在分配资源的时候,为了提高效率和资源的利用率,都是透过slab来分配的。通过slab的信息,再配合源码能粗粗了解系统的运行情况,比如说什么资源有没有不正常的多,或者什么资源有没有泄漏。linux系统透过/proc/slabinfo来向用户暴露slab的使用情况。

Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器。

保存着监视系统中所有活动的 slab 缓存的信息的文件为/proc/slabinfo。

实例

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
slabtop

Active / Total Objects (% used) : 897519 / 1245930 (72.0%)
Active / Total Slabs (% used) : 38605 / 38605 (100.0%)
Active / Total Caches (% used) : 94 / 145 (64.8%)
Active / Total Size (% used) : 129558.22K / 153432.58K (84.4%)
Minimum / Average / Maximum Object : 0.01K / 0.12K / 128.00K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
440136 171471 38% 0.05K 6113 72 24452K buffer_head
190086 148576 78% 0.05K 2437 78 9748K selinux_inode_security
151840 146366 96% 0.48K 18980 8 75920K ext3_inode_cache
144333 144143 99% 0.02K 711 203 2844K avtab_node
130529 128488 98% 0.13K 4501 29 18004K dentry_cache
99214 99071 99% 0.03K 878 113 3512K size-32
43834 28475 64% 0.27K 3131 14 12524K radix_tree_node
17818 9450 53% 0.06K 302 59 1208K size-64
4602 4562 99% 0.05K 59 78 236K sysfs_dir_cache
3220 2855 88% 0.08K 70 46 280K vm_area_struct
2460 2114 85% 0.12K 82 30 328K size-128
1564 1461 93% 0.04K 17 92 68K Acpi-Operand
1540 1540 100% 0.33K 140 11 560K inode_cache
1524 466 30% 0.01K 6 254 24K anon_vma
1440 515 35% 0.05K 20 72 80K avc_node
1440 1154 80% 0.19K 72 20 288K filp
1170 1023 87% 0.05K 15 78 60K ext3_xattr
845 724 85% 0.02K 5 169 20K Acpi-Namespace
638 315 49% 0.35K 58 11 232K proc_inode_cache
450 434 96% 0.25K 30 15 120K size-256
424 386 91% 0.50K 53 8 212K size-512
312 107 34% 0.05K 4 78 16K delayacct_cache
306 284 92% 0.43K 34 9 136K shmem_inode_cache
303 108 35% 0.04K 3 101 12K pid
300 261 87% 0.19K 15 20 60K skbuff_head_cache
300 300 100% 0.12K 10 30 40K bio
260 260 100% 32.00K 260 1 8320K size-32768
254 6 2% 0.01K 1 254 4K revoke_table
236 55 23% 0.06K 4 59 16K fs_cache
216 203 93% 1.00K 54 4 216K size-1024
214 214 100% 2.00K 107 2 428K size-2048
203 83 40% 0.02K 1 203 4K biovec-1

skill

向选定的进程发送信号冻结进程

补充说明

skill命令 用于向选定的进程发送信号,冻结进程。这个命令初学者并不常用,深入之后牵涉到系统服务优化之后可能会用到。

语法

1
skill(选项)

选项

1
2
3
4
5
6
7
8
9
-f:快速模式;
-i:交互模式,每一步操作都需要确认;
-v:冗余模式;
-w:激活模式;
-V:显示版本号;
-t:指定开启进程的终端号;
-u:指定开启进程的用户;
-p:指定进程的id号;
-c:指定开启进程的指令名称。

实例

如果您发现了一个占用大量CPU和内存的进程,但又不想停止它,该怎么办?考虑下面的top命令输出:

1
2
3
4
5
6
7
8
9
10
11
top -c -p 16514
23:00:44 up 12 days, 2:04, 4 users, load average: 0.47, 0.35, 0.31
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 0.0% 0.6% 8.7% 2.2% 0.0% 88.3% 0.0%
Mem: 1026912k av, 1010476k used, 16436k free, 0k shrd, 52128k buff
766724k actv, 143128k in_d, 14264k in_c
Swap: 2041192k av, 83160k used, 1958032k free 799432k cached

PID USER PRI NI SIZE RSS SHARE stat %CPU %MEM time CPU command
16514 oracle 19 4 28796 26M 20252 D N 7.0 2.5 0:03 0 oraclePRODB2...

既然您确认进程16514占用了大量内存,您就可以使用skill命令“冻结”它,而不是停止它。

1
skill -STOP 1

之后,检查top输出:

1
2
3
4
5
6
7
8
9
10
23:01:11  up 12 days,  2:05,  4 users,  load average: 1.20, 0.54, 0.38
1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 2.3% 0.0% 0.3% 0.0% 0.0% 2.3% 94.8%
Mem: 1026912k av, 1008756k used, 18156k free, 0k shrd, 3976k buff
770024k actv, 143496k in_d, 12876k in_c
Swap: 2041192k av, 83152k used, 1958040k free 851200k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16514 oracle 19 4 28796 26M 20252 T N 0.0 2.5 0:04 0 oraclePRODB2...

现在,CPU 从 0% 空闲变为 94% 空闲。该进程被有效冻结。过一段时间之后,您可能希望唤醒该进程:

1
skill -CONT 16514

如果希望暂时冻结进程以便为完成更重要的进程腾出空间,该方法非常有用。

此命令用途很广。如果您要停止 “oracle” 用户的所有进程,只需要一个命令即可实现:

1
skill -STOP oracle

可以使用用户、PID、命令或终端 id 作为参数。以下命令可停止所有 rman 命令。

1
skill -STOP rman

如您所见,skill 决定您输入的参数(进程 ID、用户 ID 或命令)并进行相应操作。这可能会导致在某些情况下出现这样的问题:您可能具有同名的用户和命令。最好的示例是 “oracle” 进程,通常由用户 “oracle” 运行。因此,当您希望停止名为 “oracle” 的进程时,可执行以下命令:

1
skill -STOP oracle

用户 “oracle” 的所有进程都停止,包括您可能要使用的会话。要非常明确地执行命令,您可以选择使用一个新参数指定参数的类型。要停止一个名为 oracle 的命令,可执行以下命令:

1
skill -STOP -c oracle

snice命令的功能与skill类似。但它用于降低进程的优先级,而不是停止进程。首先,检查 top 输出:

1
2
3
4
5
6
7
8
9
  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
3 root 15 0 0 0 0 RW 0.0 0.0 0:00 0 kapmd
13680 oracle 15 0 11336 10M 8820 T 0.0 1.0 0:00 0 oracle
13683 oracle 15 0 9972 9608 7788 T 0.0 0.9 0:00 0 oracle
13686 oracle 15 0 9860 9496 7676 T 0.0 0.9 0:00 0 oracle
13689 oracle 15 0 10004 9640 7820 T 0.0 0.9 0:00 0 oracle
13695 oracle 15 0 9984 9620 7800 T 0.0 0.9 0:00 0 oracle
13698 oracle 15 0 10064 9700 7884 T 0.0 0.9 0:00 0 oracle
13701 oracle 15 0 22204 21M 16940 T 0.0 2.1 0:00 0 oracle

现在,将 “oracle” 进程的优先级降低四个点。注意,该值越高,优先级越低。

1
2
3
snice +4 -u oracle
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16894 oracle 20 4 38904 32M 26248 D N 5.5 3.2 0:01 0 oracle

注意,NI 列(nice 值)现在是 4,优先级现在设置为 20,而不是 15。这对于降低优先级非常有帮助。

shutdown

用来执行系统关机的命令

补充说明

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

语法

1
shutdown(选项)(参数)

选项

1
2
3
4
5
6
7
8
-c:当执行“shutdown -h 11:50”指令时,只要按+键就可以中断关机的指令;
-f:重新启动时不执行fsck;
-F:重新启动时执行fsck;
-h:将系统关机;
-k:只是送出信息给所有用户,但不会实际关机;
-n:不调用init程序进行关机,而由shutdown自己进行;
-r:shutdown之后重新启动;
-t<秒数>:送出警告信息和删除信息之间要延迟多少秒。

参数

  • [时间]:设置多久时间后执行shutdown指令;
  • [警告信息]:要传送给所有登入用户的信息。

实例

指定现在立即关机:

1
shutdown -h now

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

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

showmount

显示NFS服务器加载的信息

补充说明

showmount命令 查询“mountd”守护进程,以显示NFS服务器加载的信息。

语法

1
showmount(选项)(参数)

选项

1
2
-d:仅显示已被NFS客户端加载的目录;
-e:显示NFS服务器上所有的共享目录。

参数

NFS服务器:指定NFS服务器的ip地址或者主机名。

shopt

显示和设置shell操作选项

补充说明

shopt命令 用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性。shopt命令若不带任何参数选项,则可以显示所有可以设置的shell操作选项。

语法

1
shopt(选项)(参数)

选项

1
2
-s:激活指定的shell行为选项;
-u:关闭指定的shell行为选项。

参数

shell选项:指定要操作的shell选项。

实例

使用shopt命令显示当前所有可以设置的shell操作选项,输入如下命令:

1
2
3
4
5
6
7
8
9
10
11
shopt           #输出所有可以设置的shell操作选项
cdable_vars off
cdspell off
checkhash off
checkwinsize on
cmdhist on
dotglob off
execfail off
expand_aliases on
extdebug off
...

如图上所示,选项”cdspell”的状态为”off”,即关闭cd拼写检查选项。现在,可以使用shopt命令将其开启,输入如下命令:

1
shopt -s cdspell          #开启cd拼写检查

执行上面的命令后,该选项的状态将变为”on”,即开启状态。可以再次通过该命令显示一下shell操作选项即可,输出信息如下:

1
cdspell on                #开启cdspell选项

用户可以通过实际执行cd命令检查该选项是否被成功开启。

sh

shell命令解释器

补充说明

sh命令 是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取。通过用户输入命令,和内核进行沟通!Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

语法

1
bash [options] [file]

选项

1
2
3
4
-c string:命令从-c后的字符串读取。
-i:实现脚本交互。
-n:进行shell脚本的语法检查。
-x:实现shell脚本逐条语句的跟踪。

实例

使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:

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
[root@AY1307311912260196fcZ satools]# sh -x check_ssh_login.sh
+ DEFINE=30
+ cat /var/log/secure
+ awk '/Failed/ {++ip[$(NF-3)]} END {for (i in ip) print i"="ip[i]}'
++ cat /root/satools/black.txt
+ for i in '`cat /root/satools/black.txt`'
++ echo 121.42.0.16=1427
++ awk -F= '{print $1}'
+ IP=121.42.0.16
++ echo 121.42.0.16=1427
++ awk -F= '{print $2}'
+ NUM=1427
+ '[' 1427 -gt 30 ']'
+ grep 121.42.0.16 /etc/hosts.deny
+ '[' 1 -gt 0 ']'
+ echo sshd:121.42.0.16
+ echo vsftpd:121.42.0.16
+ for i in '`cat /root/satools/black.txt`'
++ echo 121.42.0.72=276
++ awk -F= '{print $1}'
+ IP=121.42.0.72
++ awk -F= '{print $2}'
++ echo 121.42.0.72=276
+ NUM=276
+ '[' 276 -gt 30 ']'
+ grep 121.42.0.72 /etc/hosts.deny
+ '[' 1 -gt 0 ']'
+ echo sshd:121.42.0.72
+ echo vsftpd:121.42.0.72

sftp

交互式的文件传输程序

补充说明

sftp命令 是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还支持公钥认证和压缩等功能。

语法

1
sftp(选项)(参数)

选项

1
2
3
4
5
6
7
8
-B:指定传输文件时缓冲区的大小;
-l:使用ssh协议版本1;
-b:指定批处理文件;
-C:使用压缩;
-o:指定ssh选项;
-F:指定ssh配置文件;
-R:指定一次可以容忍多少请求数;
-v:升高日志等级。

参数

目标主机:指定sftp服务器ip地址或者主机名。

sftp-server

sftp协议的服务器端程序

补充说明

sftp-server命令 是一个“sftp”协议的服务器端程序,它使用加密的方式进行文件传输。

语法

1
sftp-server

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 ~]#