`
jishublog
  • 浏览: 861770 次
文章分类
社区版块
存档分类
最新评论

《linux命令行和shell脚本编程宝典》学习笔记

 
阅读更多

第一章 Linux shell入门


一、Linux操作系统一般包括四个主要部分:

linux内核;

GNU实用程序;

图形桌面环境;

应用软件;



二、内核的主要功能:

1、系统内存管理

2、软件程序管理

3、硬件管理

4、文件系统管理


三、系统内存管理

1、内存管理是操作系统内核的主要功能之一,内核不仅可以管理服务器上可用的物理内存,而且能够创建并管理虚拟内存,或者说非实际存在的内存。

2、内存管理必须要使用硬盘空间,该空间称为交换空间swap space,内核不断的在交换空间和实际物理内存之间交换虚拟内存位置的内容,这样系统认为可用的内存比实际存在的内存多。

3、将内存位置分组为多个数据块,此操作称为分页;内核定位物理内存或交换空间中的每个内存分页,然后维护一个内存分页表,此表说明位于物理内存的分页和交换到磁盘的分页。

4、内核跟踪使用的内存分页,并自动将一段时间没有访问的内存分页复制到交换空间区域,称为换出,即使内存仍然够用也会这样做;程序需要访问已经换出的内存分页时,内核必须换出另一个内存分页,以在物理内存中为该内存分页腾出空间,然后从交换空间换入需要的分页;显然,该过程比较耗时,可能会降低运行速度。


/proc/meminfo,可以看出Linux系统中虚拟内存的当前状态。/proc/meminfo项的实例为:

hangma@ubuntu:~$ cat /proc/meminfo
MemTotal: 1026624 kB :物理内存空间
MemFree: 361240 kB :物理内存空间的空闲空间
Buffers: 57400 kB
Cached: 291488 kB
SwapCached: 0 kB
Active: 328060 kB
Inactive: 242940 kB
Active(anon): 229988 kB
Inactive(anon): 180 kB
Active(file): 98072 kB
Inactive(file): 242760 kB
Unevictable: 32680 kB
Mlocked: 32680 kB
HighTotal: 135048 kB
HighFree: 1768 kB
LowTotal: 891576 kB
LowFree: 359472 kB
SwapTotal: 1046524 kB : 交换空间
SwapFree: 1046524 kB
Dirty: 496 kB
Writeback: 0 kB
AnonPages: 254808 kB
Mapped: 108472 kB
Shmem: 968 kB
Slab: 24940 kB
SReclaimable: 12956 kB
SUnreclaim: 11984 kB
KernelStack: 2848 kB
PageTables: 6464 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1559836 kB
Committed_AS: 2249904 kB
VmallocTotal: 122880 kB
VmallocUsed: 22016 kB
VmallocChunk: 98812 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 28664 kB
DirectMap2M: 884736 kB


5、默认情况下,在Linux系统上运行的每个进程都有自己专用的内存分页,一个进程不能访问另一个进程正在使用的内存分页;内核也有自己的内存区域,任何其他进程不能访问内核进程使用的内存;

要促进数据共享,可以创建共享内存分页,通用共享内存区域可以供多个进程读取和写入,内核维护和管理共享内存区域,并允许单个进程访问共享区域。


6、使用特殊命令ipcs可以查看系统当前的共享内存分页:

hangma@ubuntu:~$ ipcs -m


------ Shared Memory Segments --------
key shmid owner perms bytes nattch status


四、软件程序管理

、ps命令查看Linux系统中当前运行的进程。使用ps命令得到输出:

hangma@ubuntu:~$ ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
6 ? S 0:00 [migration/0]
7 ? S 0:00 [watchdog/0]
8 ? S< 0:00 [cpuset]
9 ? S< 0:00 [khelper]
10 ? S 0:00 [kdevtmpfs]
11 ? S< 0:00 [netns]
12 ? S 0:00 [sync_supers]
13 ? S 0:00 [bdi-default]
14 ? S< 0:00 [kintegrityd]
15 ? S< 0:00 [kblockd]
16 ? S< 0:00 [ata_sff]
17 ? S 0:00 [khubd]
18 ? S< 0:00 [md]
21 ? S 0:00 [khungtaskd]
22 ? S 0:00 [kswapd0]
23 ? SN 0:00 [ksmd]
24 ? SN 0:00 [khugepaged]
25 ? S 0:00 [fsnotify_mark]
26 ? S 0:00 [ecryptfs-kthrea]
27 ? S< 0:00 [crypto]
36 ? S< 0:00 [kthrotld]
38 ? S 0:00 [kworker/u:2]
39 ? S 0:00 [scsi_eh_0]
40 ? S 0:00 [scsi_eh_1]
41 ? S 0:00 [kworker/u:3]
43 ? S< 0:00 [binder]
62 ? S< 0:00 [deferwq]
63 ? S< 0:00 [charger_manager]
64 ? S< 0:00 [devfreq_wq]
66 ? S 0:00 [kworker/0:2]
202 ? S< 0:00 [mpt_poll_0]
203 ? S< 0:00 [mpt/0]
219 ? S 0:00 [scsi_eh_2]
234 ? S 0:00 [jbd2/sda1-8]
235 ? S< 0:00 [ext4-dio-unwrit]
336 ? S 0:00 upstart-udev-bridge --daemon
342 ? Ss 0:00 /sbin/udevd --daemon
426 ? Ss 0:00 dbus-daemon --system --fork
482 ? Ss 0:00 /usr/sbin/bluetoothd
496 ? Sl 0:00 rsyslogd -c5
503 ? S 0:00 avahi-daemon: running [ubuntu.local]
504 ? S 0:00 avahi-daemon: chroot helper
517 ? S< 0:00 [krfcommd]
555 ? S< 0:00 [ttm_swap]
565 ? S 0:00 /sbin/udevd --daemon
566 ? S 0:00 /sbin/udevd --daemon
572 ? Ss 0:00 /usr/sbin/cupsd -F
603 ? Sl 0:00 /usr/lib/i386-linux-gnu/colord/colord
656 ? S< 0:00 [kpsmoused]
745 ? S 0:00 [kworker/0:4]
809 ? S 0:00 upstart-socket-bridge --daemon
891 ? Ss 0:00 tpvmlpd2
987 ? Ss 0:00 /usr/sbin/sshd -D
1016 ? Ss 0:00 /usr/sbin/modem-manager
1029 ? Ssl 0:00 NetworkManager
1032 ? Sl 0:00 /usr/lib/policykit-1/polkitd --no-debug
1089 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty4
1100 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty5
1114 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty2
1115 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty3
1120 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty6
1134 ? Ss 0:00 anacron -s
1136 ? Ss 0:00 acpid -c /etc/acpi/events -s /var/run/acpid.socket
1137 ? Ss 0:00 cron
1138 ? Ss 0:00 atd
1141 ? Ssl 0:00 whoopsie
1143 ? SLsl 0:00 lightdm
1173 tty7 Rs+ 4:17 /usr/bin/X :0 -core -auth /var/run/lightdm/root/:0 -n
1341 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty1
1365 ? Sl 0:00 /usr/lib/accountsservice/accounts-daemon
1399 ? Sl 0:00 /usr/sbin/console-kit-daemon --no-daemon
1752 ? Sl 0:00 /usr/lib/upower/upowerd
1805 ? Ssl 0:00 /usr/sbin/vmware-vmblock-fuse -o subtype=vmware-vmblo
1856 ? S 0:13 /usr/sbin/vmtoolsd
2035 ? SNl 0:00 /usr/lib/rtkit/rtkit-daemon
2075 ? Sl 0:00 lightdm --session-child 12 23
2112 ? Sl 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
2123 ? Ssl 0:00 gnome-session --session=ubuntu
2158 ? Ss 0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-s
2161 ? S 0:00 /usr/bin/dbus-launch --exit-with-session gnome-sessio
2162 ? Ss 0:00 //bin/dbus-daemon --fork --print-pid 5 --print-addres
2165 ? Sl 0:00 /usr/lib/at-spi2-core/at-spi-bus-launcher
2169 ? S 0:00 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibi
2172 ? Sl 0:00 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-s
2182 ? Sl 0:01 /usr/lib/gnome-settings-daemon/gnome-settings-daemon
2192 ? Sl 0:00 /usr/lib/gvfs/gvfsd
2196 ? Sl 0:00 /usr/lib/gvfs//gvfsd-fuse -f /run/user/hangma/gvfs
2203 ? Sl 2:37 compiz
2214 ? S<l 0:00 /usr/bin/pulseaudio --start --log-target=syslog
2217 ? S 0:00 /usr/lib/pulseaudio/pulse/gconf-helper
2219 ? S 0:00 /usr/lib/i386-linux-gnu/gconf/gconfd-2
2223 ? Sl 0:00 /usr/lib/dconf/dconf-service
2226 ? Sl 0:01 nautilus -n
2228 ? Sl 0:00 bluetooth-applet
2229 ? Sl 0:00 /usr/lib/policykit-1-gnome/polkit-gnome-authenticatio
2230 ? Sl 0:00 nm-applet
2232 ? Sl 0:00 /usr/lib/gnome-settings-daemon/gnome-fallback-mount-h
2234 ? Sl 0:14 /usr/lib/vmware-tools/sbin32/vmtoolsd -n vmusr --bloc
2253 ? Sl 0:00 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
2259 ? Sl 0:00 /usr/lib/udisks2/udisksd --no-debug
2272 ? Sl 0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
2277 ? Sl 0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
2289 ? Sl 0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.7 /org/gtk/gvf
2295 ? Sl 0:00 /usr/lib/gvfs/gvfsd-burn --spawner :1.7 /org/gtk/gvfs
2332 ? Sl 0:00 /usr/lib/bamf/bamfdaemon
2341 ? Ss 0:00 /bin/sh -c /usr/bin/gtk-window-decorator
2342 ? Sl 0:00 /usr/bin/gtk-window-decorator
2353 ? Sl 0:00 /usr/lib/unity/unity-panel-service
2355 ? Sl 0:00 /usr/lib/indicator-appmenu/hud-service
2372 ? Sl 0:00 /usr/lib/indicator-messages/indicator-messages-servic
2373 ? Sl 0:00 /usr/lib/indicator-datetime/indicator-datetime-servic
2376 ? Sl 0:00 /usr/lib/indicator-sound/indicator-sound-service
2378 ? Sl 0:00 /usr/lib/indicator-session/indicator-session-service
2379 ? Sl 0:00 /usr/lib/indicator-printers/indicator-printers-servic
2381 ? Sl 0:00 /usr/lib/i386-linux-gnu/indicator-application-service
2407 ? Sl 0:00 /usr/lib/evolution/evolution-source-registry
2417 ? Sl 0:00 /usr/lib/unity-lens-files/unity-files-daemon
2418 ? Sl 0:00 /usr/lib/gwibber/unity-gwibber-daemon
2419 ? Sl 0:00 /usr/lib/unity-lens-applications/unity-applications-d
2421 ? Sl 0:00 /usr/lib/i386-linux-gnu/unity-music-daemon
2423 ? Sl 0:00 /usr/bin/python3 /usr/lib/unity-lens-photos/unity-len
2427 ? Sl 0:00 /usr/lib/i386-linux-gnu/unity-shopping-daemon
2428 ? Sl 0:00 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-
2477 ? Sl 0:00 /usr/lib/geoclue/geoclue-master
2479 ? Sl 0:00 /usr/bin/zeitgeist-daemon
2498 ? Sl 0:00 /usr/lib/ubuntu-geoip/ubuntu-geoip-provider
2506 ? Sl 0:00 /usr/lib/zeitgeist/zeitgeist-fts
2507 ? Sl 0:00 zeitgeist-datahub
2514 ? S 0:00 /bin/cat
2545 ? Sl 0:00 /usr/bin/python3 /usr/lib/unity-lens-files/unity-scop
2559 ? Sl 0:00 telepathy-indicator
2562 ? Sl 0:00 /usr/bin/python /usr/lib/unity-scope-video-remote/uni
2563 ? Sl 0:00 /usr/lib/i386-linux-gnu/unity-musicstore-daemon
2600 ? Sl 0:00 /usr/lib/telepathy/mission-control-5
2605 ? Sl 0:00 /usr/bin/signon-ui
2609 ? Ss 0:00 /bin/sh -c gnome-terminal
2610 ? Sl 0:02 gnome-terminal
2615 ? S 0:00 gnome-pty-helper
2616 pts/0 Ss 0:00 bash
2674 ? Sl 0:00 update-notifier
2694 ? S 0:00 /usr/bin/python /usr/lib/system-service/system-servic
2698 ? SNl 0:02 /usr/bin/python3 /usr/bin/update-manager --no-update
2723 ? Sl 0:00 /usr/lib/i386-linux-gnu/deja-dup/deja-dup-monitor
2741 ? S 0:00 [kworker/0:0]
3455 ? S 0:00 [flush-8:0]
3551 ? S 0:00 /usr/lib/cups/notifier/dbus dbus://
3734 pts/0 R+ 0:00 ps ax


第三列是进程的当前状态,S表示休眠,SW表示休眠并等待,R表示运行;进程名在最后一列显示;方括号中的进程表示该进程不活动,因而已经从内存换出到磁盘交换空间中。可以看出大部分进程已经换出。



五、硬件管理

linux系统需要与之通信的设备都必须在内核代码中插入驱动程序代码;驱动程序代码使内核能够向设备传输数据,它的作用就像是应用程序与硬件之间的中间人。

在Linux内核中插入设备驱动程序代码有两种方法:

1、在内核中编译驱动程序;

2、向内核中添加驱动程序模块;


开发人员开发了内核模块,可以在运行内核中插入驱动程序代码而无需重新编译内核,此外,当设备使用完毕后,可以从内核中移除内核模块,这极大的简化并扩展了linux对硬件的使用;


Linux将硬件设备标识为特殊文件,称为设备文件,设备文件分为3类:

字符

网络

1、字符设备文件用于哪些一次仅处理一个字符的设备;大部分调制解调器和终端类型都识别为字符文件;

2、块文件用于那些一次可处理大量数据块的设备,如磁盘驱动器

3、网络文件类型用于那些使用数据包发送和接收数据的设备;包括网卡和特殊回路设备;



Llinux为系统的每个设备创建特殊文件,称为节点;所有与设备的通信都设通过设备节点完成的;每个节点都有唯一的数字对,Linux内核使用数字对标识该节点;数字对包含主设备号和次设备号;


六、文件系统管理



Linux内核使用虚拟文件系统与每个文件系统进行链接,这为内核与其他文件系统类型的通信提供了一个标准接口,挂载和使用每个文件系统时,VFS在内存中缓存相关信息。



七、GNU使用程序

1、核心GNU实用程序

GNU项目的目的主要是使UNIX系统管理员有一个类似Unix环境;提供给Linux系统的核心实用程序包称为coreutils软件包,由3部分组成:

处理文件的实用程序;

操作文本的实用程序;

管理进程的实用程序;



第三章 基本的bash shell命令

一、/etc/passwd文件包含了一个所有系统用户账户组成的列表,以及一些关于每个用户的基本配置信息;例如:

angma:x:1000:1000:video-hadoop,,,:/home/hangma:/bin/bash

每个条目都有7个数据字段,使用冒号分隔;系统使用这些字段中的数据向用户分配具体的特性;这些字段由:

用户名;用户密码;用户系统用户ID编号;用户的系统组ID编号;用户的全名;用户默认的主目录;用户默认的shell程序;


二、控制命令行提示符的环境变量有两个:

1:PS1:控制默认命令行提示符的格式:

hangma@ubuntu:~$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

2:PS2:控制第二层命令行提示符的格式

hangma@ubuntu:~$ echo $PS2
>

man bash可以查看bash shell的整个手册页面


三、文件系统

1、Linux在一个目录结构中存储文件,该目录称为虚拟目录;虚拟目录包含PC上安装的所有存储设备的文件路径,它们都合并为一个目录结构;

2、Linux虚拟目录结构包含一个基本目录,称为根目录;根目录以下的目录和文件根据到达它们的目录路径列出;

3、Linux虚拟目录最神奇的地方在于结合每个存储设备的方式;安装在Linux PC中的第一个硬盘称为根驱动器;跟驱动器包含虚拟目录的核心,其他目录都是从这里开始创建的。

4、在根驱动器中,Linux创建的一些名为挂载点的特殊目录,挂载点是虚拟目录中用于分配额外存储设备的目录;

5、虚拟目录使文件和目录都出现在这些挂载点目录中,即使它们实际上存储在另一个驱动器中;

系统文件往往存储在根驱动器中,而用户文件则存储在其他驱动器中;


四、通用Linux目录名称

目录 用法
/ 虚拟目录的根目录,通常此处没有文件,
/bin 二进制目录,存储许多GNU用户级别的使用程序
/boot 引导目录,存储引导文件
/dev 设备目录,Linux在该目录中创建设备节点
/etc 系统配置文件目录
/home 主目录,lInux在该目录中创建用户目录
/lib 库目录,存储系统和应用程序库文件
/media 媒体目录,可移动媒体设备常用的挂载点
/mnt 挂在目录,另一个可移动媒体设备常用的挂载点:是不是就是mount命令映射磁盘时
/opt 可选目录,常用存储可选软件包
/root 根主目录
/sbin 系统二进制目录,存储许多GNU管理级别的使用程序
/tmp 临时目录,可以在该目录中创建和销毁临时工作文件
/usr 用户安装软件的目录
/var 可变目录,用户经常更改的文件,比如日志文件



五、linux终端显示文件不同颜色代表的含义:

1、白色:表示普通文件

2、蓝色:表示目录

3、绿色:表示可执行文件

4、红色:表示压缩文件

5、浅蓝色:链接文件

6、红色闪烁:表示链接文件有问题

7、黄色:表示设备文件

8、灰色:表示其他文件


LS_COLORS环境变量控制该特性;


六、ls命令相关

1、也可以用-F参数与ls命令配置实用,轻松区分文件和目录;

ls -F

ffmpeg-1.2.1/ ffmpeg-1.2.1.tar.bz2 yasm-1.2.0/ yasm-1.2.0.tar.gz

要将隐藏的文件和普通文件和目录一起显示,可以使用-a参数:

hangma@ubuntu:~/test$ ls -a
. .. ffmpeg-1.2.1 ffmpeg-1.2.1.tar.bz2 yasm-1.2.0 yasm-1.2.0.tar.gz


2、-R参数:显示包含在当前目录的所有目录中的文件:

ls -F -R


3、-l参数生成长列表格式,提供目录中的每个文件的详细信息:

ls -l

hangma@ubuntu:~/test$ ls -l
total 7244
drwxr-xr-x 16 hangma hangma 4096 Jun 3 10:08 ffmpeg-1.2.1
-rw-rw-r-- 1 hangma hangma 5968378 Jun 3 10:02 ffmpeg-1.2.1.tar.bz2
drwxrwxr-x 11 hangma hangma 4096 Jun 3 10:04 yasm-1.2.0
-rw-rw-r-- 1 hangma hangma 1436502 Jun 3 10:02 yasm-1.2.0.tar.gz


输出的第一行显示目录中所包含的数据块总数;之后每一行都包含每个文件的一下信息:

(1)文件类型:比如:d:目录;-:文件;c:字符设备;b:块设备

(2)文件权限:

(3)指向该文件的硬链接数量

(4)文件所有者的用户名称

(5)文件所属的组的名称

(6)文件的字节大小

(7)上次修改文件的时间

(8)文件或目录名称


4、组合选项:

-a:列出所有文件

-i:列出每个文件的索引节点

-l:列出长列表

-s:列出文件的块大小

hangma@ubuntu:~/test$ ls -sail
total 7252
1848642 4 drwxrwxr-x 4 hangma hangma 4096 Jun 3 10:03 .
1848609 4 drwxr-xr-x 21 hangma hangma 4096 Jun 27 14:23 ..
1848776 4 drwxr-xr-x 16 hangma hangma 4096 Jun 3 10:08 ffmpeg-1.2.1
1848765 5832 -rw-rw-r-- 1 hangma hangma 5968378 Jun 3 10:02 ffmpeg-1.2.1.tar.bz2
1852266 4 drwxrwxr-x 11 hangma hangma 4096 Jun 3 10:04 yasm-1.2.0
1848775 1404 -rw-rw-r-- 1 hangma hangma 1436502 Jun 3 10:02 yasm-1.2.0.tar.gz


第一个数字是文件或目录的索引节点编号;第二个数字是文件的块大小;第三个目录是文件类型以及文件的权限


5、过滤列表输出:

ls命令还提供一种在命令行定义过滤器的方法,它使用过滤器确定应该在输出中显示哪些文件或目录:

如果将特定文件的名称指定为过滤器,则ls命令将仅仅显示该文件的信息

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpeg
-rwxr-xr-x 1 root root 3606964 Jun 3 10:08 ffmpeg



当你可能还不知道要查找的文件的确切名称,这是ls命令可以使用标准的通配符字符,并使用它们匹配过滤器中的模式:

(1)问号表示一个字符

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpe?
-rwxr-xr-x 1 root root 3606964 Jun 3 10:08 ffmpeg

(2)星号表示零个或多个字符

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpeg*
-rwxr-xr-x 1 root root 3606964 Jun 3 10:08 ffmpeg
-rw-r--r-- 1 hangma hangma 119760 May 10 08:16 ffmpeg.c
-rw-r--r-- 1 root root 1878 Jun 3 10:08 ffmpeg.d
-rw-r--r-- 1 hangma hangma 33074 May 10 08:16 ffmpeg_filter.c
-rw-r--r-- 1 root root 1530 Jun 3 10:08 ffmpeg_filter.d
-rw-r--r-- 1 root root 126660 Jun 3 10:08 ffmpeg_filter.o
-rwxr-xr-x 1 root root 14788248 Jun 3 10:08 ffmpeg_g
-rw-r--r-- 1 hangma hangma 13260 May 10 08:16 ffmpeg.h
-rw-r--r-- 1 root root 335596 Jun 3 10:08 ffmpeg.o
-rw-r--r-- 1 hangma hangma 102278 May 10 08:16 ffmpeg_opt.c
-rw-r--r-- 1 root root 1452 Jun 3 10:08 ffmpeg_opt.d
-rw-r--r-- 1 root root 269552 Jun 3 10:08 ffmpeg_opt.o

五、复制文件

1、cp命令形式:

cp source destination


-R:这个参数很强大,可以递归复制整个目录的内容


-f:强制覆盖现有文件,没有提示

-i:覆盖文件前有提示

-l:创建文件链接而不是复制文件,这里创建的文件链接是硬链接

-s:创建符号链接而不是复制文件,即软连接


2、链接文件

如果需要在系统中维护同一个文件的两个副本,你不一定要使用两个物理副本,可以使用一个物理副本和多个虚拟副本,这种虚拟副本称为链接。

链接是目录中的占位符,指向文件的真实位置。


linux中有两种不同的文件链接类型:

(1)符号链接:

-s创建一个符号链接即软连接

cp -s test test3

ls -il

1854450 -rw-rw-r-- 2 hangma hangma 9 Jun 28 14:13 test
1856332 lrwxrwxrwx 1 hangma hangma 4 Jul 1 20:19 test3 -> test

注意:首先,新的文件test3的索引节点号和test不同,这表示linux系统将test和test3视为不同的文件;其次,文件大小不同;

链接文件只需要存储有关源文件的信息,而不是文件中的实际数据;列表的文件名部分实际显示了连个文件的关系:test3->test表示test3是test的符号链接。


最好不要创建符号链接的符号链接,因为这会创建一个连接链条,不仅会导致混淆,而且很容易遭到破。


(2)硬链接:

硬链接是创建一个单独的文件,其中包括有关源文件的信息和位置,引用该硬链接文件的效果和引用源文件一样:

cp -l test1 test2

这就是给文件test1创建一个硬链接test2

$cp -l test test2

$ls -il

1854450 -rw-rw-r-- 2 hangma hangma 9 Jun 28 14:13 test
1850977 -rw-rw-r-- 1 hangma hangma 9 Jun 28 14:15 test1
1854450 -rw-rw-r-- 2 hangma hangma 9 Jun 28 14:13 test2

可以发现test和test2的文件节点相同,这就表示它们是同一个文件,第三行即链接编号显示这两个文件都有两个链接。

注意:在同一物理介质的文件之间只能创建一个硬链接,不能在不同的挂载点下的文件之间创建硬链接,在这种情况下,你必须使用软连接。



3、重命名文件

重命名文件的过程称为移动:mv命令可以将文件和目录移动到另一个位置:

(1)mv test test4

移动文件将更改文件名但保留原来的索引节点号和时间戳;

移动带有软连接的文件存在问题:

1856332 lrwxrwxrwx 1 hangma hangma 4 Jul 1 20:19 test3 -> test

此时test3指向一个无效文件,不再是一个有效连接,当你再次引用test3时,系统会提示你找不到该文件:

cp test3 test5
cp: cannot stat `test3': No such file or directory


(2)还可以使用mv命令移动目录:

整个目录的内容都没有变化,唯一改变的是目录的名称


4、删除文件

硬链接文件使用的索引节点编号与源文件相同,在移除了最后一个链接文件之前,硬链接将一直维护索引节点编号,并保留数据;

而软连接的处理方式是:底层文件不在了,那么链接指向内容自然也消失了;


rm -i 文件名

使用参数-i是可以提示是否删除,防止误删。


rm的命令的另一个特性是:如果需要移出很多文件并且不希望收到提示,则可以使用-f参数强制移出


rm -f test

强制移出文件test


删除目录的命令需要加上-r参数:

rm -r test

或者是

rmdir test



rm -rf test

shell允许使用组合参数并且只要添加一个-



5、查看文件内容

(1)stat命令提供文件系统中文件状态的完整摘要:

hangma@ubuntu:~/test$ mkdir testtest
hangma@ubuntu:~/test$ stat testtest/
File: `testtest/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1850977 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ hangma) Gid: ( 1000/ hangma)
Access: 2013-07-01 20:40:29.617938701 +0800
Modify: 2013-07-01 20:40:29.617938701 +0800
Change: 2013-07-01 20:40:29.617938701 +0800
Birth: -



stat命令的结果可以显示目标文件的所有信息,甚至包括存储该文件的设备的主设备号和次级设备号


(2)查看文件类型

file命令是一个方便的使用程序,它可以查看文件内部并确定文件的类型:

file命令将文件分为以下3类:

文本文件:包含可打印字符的文件;

可执行文件:可以在系统运行的文件;

数据文件:包括不可打印的二进制字符的文件,但也不可以在系统运行;



(3)查看整个文件

cat命令

-n参数为所有行编号

hangma@ubuntu:~/test$ cat -n test1
1 djfkdsjfkldsjfkdsjjfdsjfkdlsjf
2 sdjfds
3 sdfjklfdg
4 dsfgjks
5 dsjfkds
6 werjksdf
7 fjkefj
8
hangma@ubuntu:~/test$ cat test1
djfkdsjfkldsjfkdsjjfdsjfkdlsjf
sdjfds
sdfjklfdg
dsfgjks
dsjfkds
werjksdf
fjkefj



-b只显示带文本的行编号:

hangma@ubuntu:~/test$ cat -b test1
1 djfkdsjfkldsjfkdsjjfdsjfkdlsjf
2 sdjfds
3 sdfjklfdg
4 dsfgjks
5 dsjfkds
6 werjksdf
7 fjkef






8 j


9 dsf
10 sdf


11 sdf
12 grf


若不希望出现跳格字符,则用-t

hangma@ubuntu:~/test$ cat -t test1
djfkdsjfkldsjfkdsjjfdsjfkdlsjf
sdjfds
sdfjklfdg
dsfgjks
dsjfkds
werjksdf
fjkef






j


dsf
sdf


sdf
grf



cat命令的缺点主要是在于启动后无法控制,为了剞劂这个问题,可以使用more命令:


more命令显示文本文件,但是在显示完每页数据时停止;

q:退出程序

s:向后

f:向后

b:向前

/expression:在文件中搜索expression代表的文本



less命令:显示文件的总行数以及当前显示的行数范围:

less命令可以识别向上和向下方向键,以及向上翻页和向下翻页





tail:tail命令显示最后一组文件行:默认情况下,它显示文件的最后一行,但是也可以使用命令行参数更改该数字:

-f参数是tail命令中一个很好的特性,它允许你在其他进程使用文件时查看该文件,比如当文件追加更新时,可以使用tail查看最新更新的内容



head命令:显示文件开头的一组文件行,默认情况下,他显示文件的前10行。





第四章 更多的bash shell命令

一、监控程序

1、进程查看

ps命令:

$ps

PID TTY TIME CMD
5574 pts/1 00:00:00 bash
8629 pts/1 00:00:00 tail
8692 pts/1 00:00:00 ps

默认情况下,ps命令只显示属于当前用户并正在终端中运行的进程;

ps命令的基本暑促显示了程序的进程ID即PID,进程运行的终端TTY,进程使用cpu时间。



--forest:用于显式进程的层次结构信息,但是会使用ASCII字符来绘制图表。

ps --forest

PID TTY TIME CMD
5574 pts/1 00:00:00 bash
8629 pts/1 00:00:00 \_tail
8692 pts/1 00:00:00 \_ps


2、实时进程监控:

ps命令对于收集在系统中运行的进程的信息非常实用,但同时也有一个缺点;ps命令只能显示特定时间点的信息,如果你需要查明经常在内存中换进换出的进程的趋势,那么ps命令就无能为力了。


top命令可以解决此问题:

top命令用于显示与ps命令相似的进程信息,不过它采用的是实时模式:

输出的第一部分显示了一般的系统信息,

(1)第一行显示:当前时间,系统已正常运行的时间,已登录的用户数量,以及系统的平均负载:

平均负载包含三个值,分别是1分钟平均负载值、5分钟平均负载值、15分钟平均负载值。值越高则系统负载越大;短期活动促使1分钟负载值冲高是很常见的,如果15分钟负载值处于高位,则系统可能遇到了麻烦。

注:负载值依赖于平时在系统中运行的程序和硬件配置。

(2)第二行显示一般进程信息,在top中称为任务:有多少进程正在进行、睡眠、已停止和僵死(已经运行完毕,但父进程未响应)。

(3)第三行显示CPU一般信息,top命令会根据进程所有者(用户或系统进程)和进程的状态(运行、空闲或等待)将CPU利用率划分成若干个类别。

(4)第四行和第五行详细给出系统内存的状态,第四行显示系统物理内存的状态,内存总量、当前使用的内存量和空闲内存量。第五行显示系统交换内存区域的转台,和前面相同

(5)下面的信息就是当前正在运行的进程的详细列表:

PID:进程的ID

USER:进程所有者的用户名

PR:进程的优先级

NI:进程的nice value

VIRT:进程所使用的虚拟内存总量

RES:进程当前正使用的物理内存量

SHR:进程与其他进程共享的内存量

S:进程状态:D=可中断睡眠,R=运行中,S=睡眠,T=已跟踪或已停止,Z=僵死

%CPU:进程正使用的CPU时间份额

%MEM:进程正使用的可用物理内存份额

TIME:进程启动后已使用的总CPU时间

COMMAND:进程的命令行名称


注:当启动top命令时,它会根据%CPU的值对进城进行排序,可以运行top时使用交互式命令来更改排序

例如:

hangma@ubuntu:~$ top
top - 20:53:52 up 14 min, 3 users, load average: 0.02, 0.13, 0.13 //表明时间是20:53:52,系统运行的时间为14min,已有3个用户登录,平均负载:一分钟为0.02,五分钟为0.13,十五分钟为0.13
Tasks: 166 total, 1 running, 158 sleeping, 7 stopped, 0 zombie //表明共有166个任务正在运行,158个休眠,7个停止,0个僵死
%Cpu(s): 5.4 us, 4.4 sy, 0.0 ni, 89.9 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1026624 total, 676884 used, 349740 free, 50252 buffers
KiB Swap: 1046524 total, 0 used, 1046524 free, 295364 cached


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1161 root 20 0 98.1m 34m 6496 S 7.0 3.4 0:43.11 Xorg
2206 hangma 20 0 249m 68m 30m S 2.3 6.8 0:16.96 compiz
2878 hangma 20 0 91652 15m 11m S 0.7 1.5 0:00.78 gnome-terminal
2956 hangma 20 0 5204 1376 1012 R 0.3 0.1 0:00.03 top
1 root 20 0 3628 1992 1284 S 0.0 0.2 0:01.30 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kworker/0:0
6 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd





3、停止进程

linux提供了两个命令用于发送进程信号给运行中的进程

(1)kill命令

kill命令允许根据进程的ID即PID将信号发送给相关进程:

kill命令只能使用进程ID


(2)killall命令

killall命令非常强大,可以根据进程的名称而非PID来停止进程,killall命令还允许使用通配符,它对于处理出错的系统非常有用;

注:若通配符使用不当,可能会停止重要的系统进程,导致文件系统受损。



二、监控磁盘空间

系统管理员的另一个重要任务是跟踪系统的磁盘使用情况。

挂载介质:linux文件系统将所有介质磁盘合并到一个虚拟目录中,使用新介质磁盘之前,需要将它放在一个虚拟目录中,这项任务 称为挂载。

如果你未使用支持自动挂载和卸载可移动介质的发行版,则需要手动完成这些操作。


1.mout命令,需要root权限

Mount和unmount

一个文件系统可以使用之前,必须mount。 操作系统然后做一些记录以确认正常。因为UNIX所有的文件在一个目录树中, mount操作的结果使新的文件系统的内容好象在某个已经mount的文件系统的 一个已经存在的子目录中。

例如,图4.3显示3个单独的文件系统,每个有其自己的根目录。 当后2个文件系统被mount到第一个文件系统的/home/usr, 我们得到一个目录树,如图 4.4.

figure1226
图4.3:3个单独的文件系统。

figure1233
图4.4:/home/usr已经mount上。

上面的mount可能使用如下命令:

$mount /dev/hda2 /home
$mount /dev/hda3 /usr
$
mount命令使用2个参数。 第一个是与包括文件系统的磁盘或分区相关的设备文件。第二个是要mount到的目录。 mount以后,这2个文件系统的内容好象是/home/usr目录。 这样就可以说:/dev/hda2被mount到/home,/usr也同样。 要看每个文件系统,就看其被安装的目录,好象它就是在那里。 注意设备文件的区别,/dev/hda2, 和安装到的目录/home。 设备文件给出硬盘原始内容的存取,安装到的目录给出磁盘上文件的存取。安装到的目录叫安装点



mount命令用于挂载介质。默认情况下,mount命令显示系统当前挂载的介质设备列表

hangma@ubuntu:~$ mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro) //介质的设备位置为/dev/sda1;介质在虚拟目录中的挂载点:on /即挂载在根目录下;文件系统类型:type ext4;已挂在介质的访问状态:(rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
gvfsd-fuse on /run/user/hangma/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=hangma)
/dev/sr0 on /media/hangma/ICBC Ebanking type iso9660 (ro,nosuid,nodev,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500,uhelper=udisks2)

mount命令提供了4条信息:

介质的设备位置;

介质在虚拟目录中的挂载点;

文件系统类型;

已挂在介质的访问状态;


要手动在虚拟目录中挂载介质设备,需要使用根目录登录;用于手动挂载介质设备的基本命令如下:

mount [-t type] [-o options] device dir

type:这个参数定义格式化磁盘的文件系统类型;

device:需要挂载的设备

dir:挂载目录


-o选项

-o允许使用一列逗号分隔额外选项挂载文件系统。常用的选项包括:

ro:以只读形式挂载

rw:以读写形式挂载

user=xxxx:允许普通用户挂载文件系统

check=none:挂载文件系统,而不执行完整检查

loop:挂载某个文件,用来把一个文件当成硬盘分区挂街上系统

iocharset:指定访问文件系统所用字符集。简体中文一般用gb2312或者cp936

codepage:指定文件系统的代码页:简体中文代码时936


使用mount命令将samba分区挂载到某个目录下:

mount -t cifs -o username=root,password=abctest //192.88.88.11/www /home/www

或者是

mount -t smbfs -o username=root,password=abctest //192.88.88.11/www /home/www

如果-t smbfs这条命令不能用,有可能内核将smbfs换成cifs了。


注:

(1)mount命令不能mount ntfs分区

这是因为内核不支持NTFS文件系统的原因,需要安装内核的NTFS文件系统支持包,以使内核支持NTFS文件系统

(2)如何挂载U盘和mp3

如果计算机没有其他SCSI设备和usb外设的情况下,插入U盘的设备路径是/dev/sda1,用命令:

mkdir /mnt/udisk

mount /dev/sda1 /mnt/udisk

这样就挂载好了

(3).iso文件是CD在单个文件中的完整映像,可以直接将.iso文件挂载到Linux虚拟目录中,而无需将其刻录到CD中,这可以使用loop选项中使用-o参数来完成:

例如:

mount -t iso9660 -o loop xxx.iso mnt

这就把xxx.iso挂载到当前目录下的mnt目录下了

(4)mount --bind

是将一个目录中的内容挂载到另一个目录中,用法是:

mount --bind olddir newdir

这个命令在自己搭建FTP要共享某个目录的时候变得特别方便,如果取消这个mount命令:

mount --move olddir newdir

(5)卸载mount命令,使用unmount命令

可使用三条命令:

unmount 设备名

unmount 挂在目录

unmount 设备名 挂在目录


(6)为什么unmount的时候老显示device busy:

因为有程序正在访问这个设备,最简单的办法就是让访问该设备的程序退出以后在unmount,可能有时候用户搞不清楚什么设备在访问设备;

unmount -l 设备名

这个命令的意思是指并不马上unmount ,而是在该目录空闲后在unmount:

可以先用命令ps aux来查看占用设备的程序PID,再用kill命令杀死占用设备的进程。




























分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics