Shell实例手册2

linux操作系统提供的信号{
			
			kill -l                    # 查看linux提供的信号
			trap "echo aaa"  2 3 15    # shell使用 trap 捕捉退出信号

			# 发送信号一般有两种原因:
			#   1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
			#   2(主动式)  通过系统调用kill来向指定进程发送信号                             
			# 进程结束信号 SIGTERM 和 SIGKILL 的区别:  SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
			# 如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

			SIGHUP  1          A     # 终端挂起或者控制进程终止
			SIGINT  2          A     # 键盘终端进程(如control+c)
			SIGQUIT 3          C     # 键盘的退出键被按下
			SIGILL  4          C     # 非法指令
			SIGABRT 6          C     # 由abort(3)发出的退出指令
			SIGFPE  8          C     # 浮点异常
			SIGKILL 9          AEF   # Kill信号  立刻停止
			SIGSEGV 11         C     # 无效的内存引用
			SIGPIPE 13         A     # 管道破裂: 写一个没有读端口的管道
			SIGALRM 14         A     # 闹钟信号 由alarm(2)发出的信号 
			SIGTERM 15         A     # 终止信号,可让程序安全退出 kill -15
			SIGUSR1 30,10,16   A     # 用户自定义信号1
			SIGUSR2 31,12,17   A     # 用户自定义信号2
			SIGCHLD 20,17,18   B     # 子进程结束自动向父进程发送SIGCHLD信号
			SIGCONT 19,18,25         # 进程继续(曾被停止的进程)
			SIGSTOP 17,19,23   DEF   # 终止进程
			SIGTSTP 18,20,24   D     # 控制终端(tty)上按下停止键
			SIGTTIN 21,21,26   D     # 后台进程企图从控制终端读
			SIGTTOU 22,22,27   D     # 后台进程企图从控制终端写
			
			缺省处理动作一项中的字母含义如下:
				A  缺省的动作是终止进程
				B  缺省的动作是忽略此信号,将该信号丢弃,不做处理
				C  缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
				D  缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)
				E  信号不能被捕获
				F  信号不能被忽略
		}
		
		系统性能状态{

			vmstat 1 9
			
			r      # 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。
			b      # 等待IO的进程数量,表示阻塞的进程。
			swpd   # 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。
			free   # 空闲的物理内存的大小
			buff   # 已用的buff大小,对块设备的读写进行缓冲
			cache  # cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
			inact  # 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示
			active # 活跃的内存大小 -a选项时显示
			si   # 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。
			so   # 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
			bi   # 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
			bo   # 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
			in   # 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多
			cs   # 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。
			us   # 用户进程执行消耗cpu时间(user time)  us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施
			sy   # 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
			id   # 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
			wt   # 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。
			
			如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。
			如果 pi po 长期不等于0,表示内存不足。
			如果 b 队列经常大于3,表示io性能不好。

		}

	}

	日志管理{

		history                      # 历时命令默认1000条
		HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "   # 让history命令显示具体时间
		history  -c                  # 清除记录命令
		cat $HOME/.bash_history      # 历史命令记录文件
		last                         # 查看登陆过的用户信息
		who /var/log/wtmp            # 查看登陆过的用户信息
		lastlog                      # 用户最后登录的时间
		lastb -a                     # 列出登录系统失败的用户相关信息
		/var/log/btmp                # 登录失败二进制日志记录文件
		tail -f /var/log/messages    # 系统日志
		tail -f /var/log/secure      # ssh日志

	}

	selinux{

		sestatus -v                    # 查看selinux状态
		getenforce                     # 查看selinux模式
		setenforce 0                   # 设置selinux为宽容模式(可避免阻止一些操作)
		semanage port -l    # 查看selinux端口限制规则
		semanage port -a -t http_port_t -p tcp 8000  # 在selinux中注册端口类型
		vi /etc/selinux/config         # selinux配置文件
		SELINUX=enfoceing              # 关闭selinux 把其修改为  SELINUX=disabled

	}

	查看剩余内存{

		free -m
		#-/+ buffers/cache:       6458       1649
		#6458M为真实使用内存  1649M为真实剩余内存(剩余内存+缓存+缓冲器)
		#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小

	}
	
	系统信息{

		uname -a              # 查看Linux内核版本信息
		cat /proc/version     # 查看内核版本
		cat /etc/issue        # 查看系统版本
		lsb_release -a        # 查看系统版本  需安装 centos-release
		locale -a             # 列出所有语系
		hwclock               # 查看时间
		who                   # 当前在线用户
		w                     # 当前在线用户
		whoami                # 查看当前用户名
		logname               # 查看初始登陆用户名
		uptime                # 查看服务器启动时间
		sar -n DEV 1 10       # 查看网卡网速流量
		dmesg                 # 显示开机信息
		lsmod	              # 查看内核模块

	}
	
	硬件信息{

		more /proc/cpuinfo                                       # 查看cpu信息
		lscpu                                                    # 查看cpu信息
		cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c    # 查看cpu型号和逻辑核心数
		getconf LONG_BIT                                         # cpu运行的位数
		cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c    # 物理cpu个数
		cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l     # 结果大于0支持64位
		cat /proc/cpuinfo|grep flags                             # 查看cpu是否支持虚拟化   pae支持半虚拟化  IntelVT 支持全虚拟化
		more /proc/meminfo                                       # 查看内存信息
		dmidecode                                                # 查看全面硬件信息
		dmidecode | grep "Product Name"                          # 查看服务器型号
		dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range       # 查看内存插槽
		cat /proc/mdstat                                         # 查看软raid信息
		cat /proc/scsi/scsi                                      # 查看Dell硬raid信息(IBM、HP需要官方检测工具)
		lspci                                                    # 查看硬件信息
		lspci|grep RAID                                          # 查看是否支持raid
		lspci -vvv |grep Ethernet                                # 查看网卡型号
		lspci -vvv |grep Kernel|grep driver                      # 查看驱动模块
		modinfo tg2                                              # 查看驱动版本(驱动模块)
		ethtool -i em1                                           # 查看网卡驱动版本

	}
	
	终端快捷键{

		Ctrl+A             # 行前
		Ctrl+E             # 行尾
		Ctrl+S             # 终端锁屏
		Ctrl+Q            # 解锁屏
		Ctrl+D            # 退出

	}

	开机启动模式{

		vi /etc/inittab
		id:3:initdefault:    # 3为多用户命令
		#ca::ctrlaltdel:/sbin/shutdown -t3 -r now   # 注释此行 禁止 ctrl+alt+del 关闭计算机

	}

	终端提示显示{

		echo $PS1                   # 环境变量控制提示显示
		PS1='[\u@ \H \w \A \@#]\$'
		PS1='[\u@\h \W]\$'

	}

	定时任务{

		at 5pm + 3 days /bin/ls  # 单次定时任务 指定三天后下午5:00执行/bin/ls
	
		crontab -e               # 编辑周期任务
		#分钟  小时    天  月  星期   命令或脚本
		1,30  1-3/2    *   *   *      命令或脚本  >> file.log 2>&1
		echo "40 7 * * 2 /root/sh">>/var/spool/cron/root    # 直接将命令写入周期任务
		crontab -l                                          # 查看自动周期性任务
		crontab -r                                          # 删除自动周期性任务
		cron.deny和cron.allow                               # 禁止或允许用户使用周期任务
		service crond start|stop|restart                    # 启动自动周期性服务

	}

	date{

		date -s 20091112                     # 设日期
		date -s 18:30:50                     # 设时间
		date -d "7 days ago" +%Y%m%d         # 7天前日期
		date -d "5 minute ago" +%H:%M        # 5分钟前时间
		date -d "1 month ago" +%Y%m%d        # 一个月前
		date -d '1 days' +%Y-%m-%d           # 一天后
		date -d '1 hours' +%H:%M:%S          # 一小时后
		date +%Y-%m-%d -d '20110902'         # 日期格式转换
		date +%Y-%m-%d_%X                    # 日期和时间
		date +%N                             # 纳秒
		date -d "2012-08-13 14:00:23" +%s    # 换算成秒计算(1970年至今的秒数)
		date -d "@1363867952" +%Y-%m-%d-%T   # 将时间戳换算成日期
		date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T  # 将时间戳换算成日期
		date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S"    # 格式化系统启动时间(多少秒前)

	}

	最大连接数{

		ulimit -SHn 65535  # 最大文件句柄数,最大打开文件数(等同最大连接数)
		ulimit -a          # 查看
		
		/etc/security/limits.conf         # 进程最大打开文件数
		# nofile 可以被理解为是文件句柄数 文件描述符 还有socket数
		* soft nofile 65535
		* hard nofile 65535
		# 最大进程数
		# ps -mp <PID> 查看某进程的线程数
		* soft nproc 16384     # 不要设置太大,容易把机器拖死, lsof |wc -l 可以看到数量
		* hard nproc 32768     

		# 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置
		# 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置
		/etc/security/limits.d/90-nproc.conf    # centos6.3的最大进程数文件
		* soft nproc 16384       
		* hard nproc 32768

	}
	
	sudo{

		echo myPassword | sudo -S ls /tmp  # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备
		visudo     # sudo命令权限添加  /etc/sudoers
		用户  别名(可用all)=NOPASSWD:命令1,命令2
		user  ALL=NOPASSWD:/bin/su      # 免root密码切换root身份
		wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
		UserName ALL=(ALL) ALL
		UserName ALL=(ALL) NOPASSWD: ALL
		peterli        ALL=(ALL)       NOPASSWD:/sbin/service
		Defaults requiretty             # sudo不允许后台运行,注释此行既允许
		Defaults !visiblepw             # sudo不允许远程,去掉!既允许

	}

	grub开机启动项添加{

		vim /etc/grub.conf
		title ms-dos
		rootnoverify (hd0,0)
		chainloader +1

	}

	stty{

		#stty时一个用来改变并打印终端行设置的常用命令

		stty iuclc          # 在命令行下禁止输出大写
		stty -iuclc         # 恢复输出大写
		stty olcuc          # 在命令行下禁止输出小写
		stty -olcuc         # 恢复输出小写
		stty size           # 打印出终端的行数和列数
		stty eof "string"   # 改变系统默认ctrl+D来表示文件的结束 
		stty -echo          # 禁止回显
		stty echo           # 打开回显
		stty -echo;read;stty echo;read  # 测试禁止回显
		stty igncr          # 忽略回车符
		stty -igncr         # 恢复回车符
		stty erase '#'      # 将#设置为退格字符
		stty erase '^?'     # 恢复退格字符
		
		定时输入{
		
			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 10 varname    # 更简单的方法就是利用read命令的-t选项
		
		}

		检测用户按键{

			#!/bin/bash
			old_tty_settings=$(stty -g)   # 保存老的设置(为什么?). 
			stty -icanon
			Keypress=$(head -c1)          # 或者使用$(dd bs=1 count=1 2> /dev/null)
			echo "Key pressed was \""$Keypress"\"."
			stty "$old_tty_settings"      # 恢复老的设置. 
			exit 0

		}

	}


你可能感兴趣的:(Shell实例手册2)