Shell脚本学习笔记-系统管理
Solaris系统上Shell脚本学习。
文件系统
/sbin主要放置一些系统管理的必备程序,例如fdisk,ifconfig,mount等
/usr/sbin主要存放一些并非必备的系统管理工具。例如df,host,ping,swap,tar等。
/bin主要放置一些用户必备程序。
/usr/bin主要存放一些并非必备的用户程序。
很多程序都在/bin和/usr/bin下面存放了2份拷贝,例如bash,cd,cat,cp,df,du,mv等。
/usr/sfw/bin/: sfw是sunfreeware的缩写,这个目录下有很多有用的工具,例如gcc,g++,mysql,snmpwalk等。
sfw下的程序列表在http://sunfreeware.com/网站上有着详细的说明。
另外一个网站也能下载很多free applications -> http://unixpackages.com/.
/usr/lib:包含库文件。
/usr/include:头文件。
/usr/X11R6:X Window系统目录。
/usr/share/doc和/usr/share/man 应用程序的文档和手册。
/etc/passwd: password文件
/etc/motd: message of today,每次用户成功登录后,其中的内容会显示在控制台。
/etc/issue: 远程登录时,文件的内容显示在login提示符之前。
/etc/release: 系统release信息
/etc/syslog.conf: /usr/sbin/syslogd进程利用本配置文件来定义记录syslog的行为
/etc/init.d和/etc/rc*.d
1) 每个运行级别被运行控制脚本控制,称作/sbin/rc#,#是运行级别0-6中的一个或是s或S。
这些脚本可以认为是元脚本,他们的主要作用是运行其他脚本。/etc/rc#是这些脚本的一个软链接.
2) /sbin/rc#运行的脚本是服务控制脚本,这些服务控制脚本可以在目录/etc/rc#.d下找到。
/etc/init.d目录这些服务控制脚本的真正位置,硬链接到/etc/rc#.d目录并被命名为K##service或S##sevice。
启动的脚本用S打头,终止的用K打头,相当于运行/etc/init.d/service start和/etc/init.d/service stop.
##是数字,表示运行顺序.
要运行某一运行级别,就是说用/sbin/rc#运行与之级别相对应的/etc/rc#.d下的脚本时,
kill脚本先运行,再运行start脚本。lowest-numbered 脚本首先运行。例如:S20foo 在S30bar之前运行。
例如,
$find *.d -name "*apache*" -ls
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 init.d/apache
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 rc0.d/K16apache
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 rc1.d/K16apache
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 rc2.d/K16apache
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 rc3.d/S50apache
10157 3 -rwxr--r-- 6 root sys 2452 Apr 15 2011 rcS.d/K16apache
可以看到这些文件的inode是相同的,是硬链接.
3) A服务的运行如果需要B服务的支持,A一定要等B先开始运行,所以要命名为:
S18B,S19A
关闭的时候,要先关A,所以要命名为:
K18A,K19B
/var: 此目录下存放使用过程中可更改的数据
/var/run/:用以跟踪系统从启动以来使用的所有进程,并让您在更改系统运行级别的时候能够操纵它们。
/var/tmp/:与/tmp相比,/tmp目录开机就会清除,一般映射到swap里面(可用df /tmp查看); /var/tmp则不会被清除
/var/spool/:此目录包含系统中等待处理的工作文件
/var/adm/sulog: 跟踪su使用记录
/var/log/:此目录包含系统的日志文件,由/etc/syslog.conf配置
/var/adm/messages*: 系统日志文件,由/etc/syslog.conf配置
/dev/console: 系统控制台,
/dev/pts/n: 远程登陆(telnet,ssh等)后创建的控制终端。
/dev/tty: 当前会话的控制终端(=某一个/dev/pts/n或者/dev/console)
可以使用tty命令查看当前的控制终端。
修改/etc/default/login, 添加CONSOLE=/dev/console, 禁止root帐户远程登陆。
/dev/null和/dev/zero
把/dev/null 看作"黑洞" . 它非常等价于一个只写文件.
所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
/dev /zero也是一个伪文件. 它实际上产生连续不断的二进制的零流.
写入它的输出会丢失不见, 而从/dev/zero 读出一连串的null也比较困难,
主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.
所以可以执行cat /dev/null>out, 因为null是没有,所以就清空out文件,
但是如果执行cat /dev/zero > out 的话,很快分区就out文件填满了.
产生1个1M的空文件:dd if=/dev/zero of=out count=1024 bs=1024
/dev/random和/dev/urandom 伪随机设备,提供2进制随机字节流.
/dev/random提供更高品质随机数,但是也更慢.可以用下面的命令比较一下花费的时间
time dd if=/dev/random of=random.file count=10 bs=1024
time dd if=/dev/urandom of=urandom.file count=10 bs=1024
系统管理
$shutdown -g10 -y -i state: 关机。-g 等待时间,默认60s; -y 不需要确认; -i 指定系统运行状态,默认为s
1 administrative state.
s, S single-user state. All user processes are stopped on transitions to this state.
5 Shut the machine down so that it is safe to remove the power. Have the machine remove power, if possible.
6 Stop the operating system and reboot to the state defined by the init default entry in /etc/inittab.
$init [1~6]: 5 关机; 6 重启
2: multi-user mode; 3: extend multi-user mode by making local resources available over network.
$isainfo:识别系统架构信息;-b :32位or64位系统; -v verbose output
$psrinfo:处理器信息
$prtdiag: print system diagnostic information. -v verbose mode
$uname -a:显示系统信息
$showrev: 打印系统软硬件版本信息; -a 输出window系统和patch的版本; -p patch的版本
$df -h: 察看磁盘使用状况
$du -sh *: 察看文件/目录大小 s:summary, h:human readable format
$ifconfig
$ifconfig -a:查看网络配置,interface name,IP address, MAC address等
$ifconfig <interface name> dhcp drop|start:启动或者禁止DHCP。
$ifconfig <interface name> ether <mac address(x:y:z:...)>:设置网卡MAC地址。
$ifconfig <interface name> up/down:启用/禁用网卡
Mount ISO文件:
# lofiadm -a /path/sol_10.iso /dev/lofi/1
# lofiadm
# mkdir /sol10
# mount -F hsfs -o ro /dev/lofi/1 /sol10
# df -h /sol10
# umount /sol10
# lofiadm -d /dev/lofi/1
# lofiadm
$svcs:报告Service状态
$svcadm:管理Service
$useradd -m -d <dir> <login>:创建用户(-m 创建folder; dir例 /export/home/tony)
$userdel -r <login>:删除用户(-r 同时删除用户folder)
$passwd [<login>]:修改密码;-h修改用户目录;-e修改login shell; 可查看/etc/passwd文件
$env:显示环境变量
$type/which <command>:显示命令路径
$pwd: 显示工作目录
$id: 用户id,所属group的id
$su [- <login>] :切换用户
$who :登录的用户列表, -r 显示系统运行级别; finger,比who信息更详细;rusers [host]: 显示网络中所有登陆用户;
$write <login> [terminal]: 发送消息给某个用户,输入消息后ctrl+d结束。
$wall: write all 发送给登陆到本机的所有用户; rwall: 发送到局域网上的所有用户, rwall -n netgroup, rwall -h host
crontab
crontab file 安装一个新的crontab文件(覆盖原来的设定)
-l [username] 查看用户的crontab文件
-e [username] 编辑用户的crontab文件,使用EDITOR环境变量指定的编辑器,例如
export EDITOR=vi; crontab -e
-r [username] 删除用户的crontab文件,只有root用户才可以删除其它用户的crontab文件
只有root用户才可以查看/删除/编辑其它用户的crontab文件;
crontab文件位于/var/spool/cron/crontabs目录下,每个用户有自己的文件;
/etc/cron.d目录下面的cron.allow和cron.deny文件可以控制那些用户可以使用crontab:
如果cron.allow存在,只有其中列出的用户才能使用该命令;
如果cron.allow不存在但cron.deny文件存在,只有未列在该文件中的用户才能使用该命令;
crontab文件的格式
mm hh dd mon weekday command
weekday的表示0-6 0表示周日;
"*"表示所有取值;"-"表示范围;","隔开来指定多个取值;
command字段的第一行作为命令,其它行作为命令的输入.%解释为换行,所以如果需要使用%要加转义符;
cron从$HOME启动command,提供以下的环境变量SHELL HOME LOGNAME TZ PATH,
SHELL设置为/bin/sh;PATH设置为/usr/bin(root用户为/usr/bin:/usr/sbin)
所以要么在command中设置完整路径,要么显式指定PATH变量;
例如: 6-10 20,22 * * 0 $HOME/test.sh >> $HOME/logs/cron.log
at time < commandfile 延迟到指定时间运行命令文件.
atq列出队列里的所有任务; atrm删除队列里的任务;
/var/spool/cron/atjobs目录下保存当前未完成的任务;
/etc/cron.d目录下面的at.allow和at.deny文件可以控制那些用户可以使用at:
邮件
列出本地邮箱(/var/mail/$USER)中的消息:
mailx
读取文件内容作为邮件正文发送:
mailx -s "hello" tony@hotmail.com < filename
把srcfile作为附件(附件名pathname)发送:
uencode srcfile pathname | mailx -s "hello" tony@hotmail.com
同时发送正文(内容在文件filename中)和附件srcfile(附件名pathname)
uuencode srcfile pathname > mailatt.tmp
cat filename mailatt.tmp > mail.tmp
mailx -s "hello" tony@hotmail.com < mail.tmp