摘要
本博文主要是介绍的操作系统中的实战,帮助大家在操作服务器做一个参考。
一、mount挂载Windows共享文件夹
现实中会有这样的场景 , 开发人员在 Windows 上面写代码 , 然后放到 Linux 进行编译 , 达到这个目的我们可以在 Linux 上使用 mount 命令挂载 Windows 共享文件夹 , 就像将 Windows 里面的共享目录当成一个U盘插到 Linux主机上面 , 然后 Linux 可以直接访问代码进行编译编译 ; 具体操作步骤如下 :
1.1 先在 Windows 下面共享需要挂载的目录
右键需要共享的文件夹 , 选择共享 , 然后默认设置就可以,然后在其他的机器测试是否能正常访问 , 在其他机器资源管理器里面输入 \\192.168.0.102\Share , 地址格式是 \\你的IP\你的共享文件夹
出现无法访问或者指定的密码不正确时 , 可参考如下设置 :
- 修改网络安全设置 : 开始 -> 运行 gpedit.msc , 打开组策略 -> 计算机配置 -> Windows设置 -> 安全设置 -> 本地策略 -> 安全选项 -> 选择 “网络安全 : LAN 管理器身份验证级别” , 双击打开 , 设置成“发送 LM 和 NTLM 响应” 。
- 修改网络访问模型 : 开始 -> 运行 -> gpedit.msc -> 计算机配置 -> Windows设置 -> 安全设置 -> 本地策略 -> 安全选项 -> 选择 “网络访问:本地帐户的共享和安全模型” , 修改用经典模式 。
1.2 在linux下面创建一个需要挂载到的目录
mount 命令同时要求在sudo su 下才能进行
我创建的目录是 :/xjl/share/data
利用 mount 命令进行挂载:
# mount -t cifs -o username=Bob,password=123456 //192.168.0.102/Share /xjl/share/data/
参数说明 : username , Window 系统登录用户名 ; password : Window 系统登录密码 ; //192.168.0.102/Share : 设置Window共享目录的路径 ; /xjl/share/data/ : 挂载到 Linux 下的那个目录。
挂载完成后我们就可以在 /xjl/share/data/ 目录里面看到 Windows 共享文件夹里面的文件。
1.3 查挂载在状态
或者使用# mount
也可进行查看。
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 38G 4.3G 34G 12% /
devtmpfs 235M 0 235M 0% /dev
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 245M 4.3M 241M 2% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
/dev/sda2 1014M 131M 884M 13% /boot
tmpfs 49M 0 49M 0% /run/user/0
//192.168.0.102/Share 245G 54G 191G 22% /usr/local/bin/code
1.4 卸载mount文件
# umount /xjl/share/data
umount 时提示错误 target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) , 你可以先切换到别的目录再试一次 , 原因也可能是其他进程可能在使用目录 , 可以先关闭使用该目录的进程 , 然后再 umount , 命令如下 (使用 fuser 需安装 psmisc # yum install psmisc) :
再次使用的卸载的命令
# fuser -m /usr/local/bin/code
/usr/local/bin/code: 2806c
# ps aux | grep 2806
root 2806 0.0 0.5 116040 2836 pts/0 Ss 11:31 0:00 -bash
root 2925 0.0 0.1 112648 960 pts/0 S+ 14:36 0:00 grep --color=auto 2806
# kill -9 2806
# umount /usr/local/bin/code
二、文件及目录管理
2.1 创建和删除
- 创建:mkdir
- 删除:rm
- 删除非空目录:rm -rf file目录
- 删除日志 rm *log (等价: $find ./ -name “*log” -exec rm {} ;)
- 移动:mv
- 复制:cp (复制目录:cp -r )
查看当前目录下文件个数:
$find ./ | wc -l
复制目录:
$cp -r source_dir dest_dir
2.2 目录的切换
- 找到文件/目录位置:cd
- 切换到上一个工作目录: cd -
- 切换到home目录: cd or cd ~
- 显示当前路径: pwd
- 更改当前工作路径为path: $cd path
2.3 查找目录以及文件
搜寻文件或目录:
$find ./ -name "core*" | xargs file
查找目标文件夹中是否有obj文件:
$find ./ -name '*.o'
递归当前目录及子目录删除所有.o文件:
$find ./ -name "*.o" -exec rm {} \;
find是实时查找,如果需要更快的查询,可试试locate;locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库:
$locate string
寻找包含有string的路径:
$updatedb
与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。
2.4 查看文件内容
查看文件:
cat vi head tail more
显示时同时显示行号:
$cat -n
按页显示列表内容:
$ls -al | more
只看前10行:
$head - 10 **
显示文件第一行:
$head -1 filename
显示文件倒数第五行:
$tail -5 filename
查看两个文件间的差别:
$diff file1 file2
动态显示文本最新信息:
$tail -f crawler.log
2.5 查询文件内容
使用egrep查询文件内容:
egrep '03.1\/CO\/AE' TSF_STAT_111130.log.012
egrep 'A_LMCA777:C' TSF_STAT_111130.log.035 > co.out2
2.6 文件目录权限的修改
- 改变文件的拥有者 chown
- 改变文件读、写、执行等属性 chmod
- 递归子目录修改: chown -R tuxapp source/
- 增加脚本可执行权限: chmod a+x myscript
2.7 给文件增加别名
创建符号链接/硬链接:
ln cc ccAgain :硬连接;删除一个,将仍能找到;
ln -s cc ccTo :符号链接(软链接);删除源,另一个无法使用;(后面一个ccTo 为新建的文件)
2.8 设置环境变量
修改文件
vim /etc/profile
安装的软件路径一般需要加入到path中:
PATH=$APPDIR:/opt/app/soft/bin:$PATH:/usr/local/bin:$TUXDIR/bin:$ORACLE_HOME/bin;export PATH
2.9 快捷键的输入与删除
Ctl-U 删除光标到行首的所有字符,在某些设置下,删除全行
Ctl-W 删除当前光标到前边的最近一个空格之间的字符
Ctl-H backspace,删除光标前边的字符
Ctl-R 匹配最相近的一个文件,然后输出
三、文本处理
3.1 find文件查找
查找txt和pdf文件:
find . \( -name "*.txt" -o -name "*.pdf" \) -print
正则方式查找.txt和pdf:
find . -regex ".*\(\.txt|\.pdf\)$"
-iregex: 忽略大小写的正则
否定参数 ,查找所有非txt文本:
find . ! -name "*.txt" -print
指定搜索深度,打印出当前目录的文件(深度为1):
find . -maxdepth 1 -type f
按类型搜索
find . -type d -print //只列出所有目录
按时间搜索
-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
-mtime 修改时间 (内容被修改)
-ctime 变化时间 (元数据或权限变化)
最近第7天被访问过的所有文件:
find . -atime 7 -type f -print
最近7天内被访问过的所有文件:
find . -atime -7 -type f -print
查询7天前被访问过的所有文件:
find . -atime +7 type f -print
按大小搜索:
w字 k M G 寻找大于2k的文件:
find . -type f -size +2k
按权限查找:
find . -type f -perm 644 -print //找具有可执行权限的所有文件
按用户查找:
find . -type f -user weber -print// 找用户weber所拥有的文件
删除当前目录下所有的swp文件:
find . -type f -name "*.swp" -delete
3.2 grep文件搜索
grep match_patten file // 默认访问匹配行
常用参数
-o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
-c 统计文件中包含文本的次数: grep -c “text” filename
-n 打印匹配的行号
-i 搜索时忽略大小写
-l 只打印文件名
在多级目录中对文本递归搜索(程序员搜代码的最爱):
grep "class" . -R -n
匹配多个模式:
grep -e "class" -e "vitural" file
grep输出以0作为结尾符的文件名(-z):
grep "test" file* -lZ| xargs -0 rm
综合应用:将日志中的所有带where条件的sql查找查找出来:
cat LOG.* | tr a-z A-Z | grep "FROM " | grep "WHERE" > b
3.3 sort 排序
字段说明
-n 按数字进行排序 VS -d 按字典序进行排序
-r 逆序排序
-k N 指定按第N列排序
示例:
sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符
3.4 消除重复行
消除重复行:
sort unsort.txt | uniq
统计各行在文件中出现的次数
sort unsort.txt | uniq -c
找出重复行
sort unsort.txt | uniq -d
3.5 paste按照列拼接文本
将两个文本按列拼接到一起;
cat file1
1
2
cat file2
colin
book
paste file1 file2
1 colin
2 book
默认的定界符是制表符,可以用-d指明定界符:
paste file1 file2 -d ","
1,colin
2,book
3.6 wc统计行和字符的工具
$wc -l file // 统计行数
$wc -w file // 统计单词数
$wc -c file // 统计字符数
3.7 sed文本替换
首处替换
sed 's/text/replace_text/' file //替换每一行的第一处匹配的text
全局替换
sed 's/text/replace_text/g' file
默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
sed -i 's/text/repalce_text/g' file
移除空白行
sed '/^$/d' file
变量转换
已匹配的字符串通过标记&来引用.
echo this is en example | sed 's/\w+/[&]/g'
$>[this] [is] [en] [example]
子串匹配标记
第一个匹配的括号内容使用标记 1 来引用
sed 's/hello\([0-9]\)/\1/'
双引号求值
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
sed 's/$var/HLLOE/'
当使用双引号时,我们可以在sed样式和替换字符串中指定变量;
p=patten
r=replaced
echo "line con a patten" | sed "s/$p/$r/g"
$>line con a replaced
其它示例
字符串插入字符:将文本中每行内容(ABCDEF) 转换为 ABC/DEF:
sed 's/^.\{3\}/&\//g' file
四、磁盘管理
4.1 查询磁盘空间
df -h
---------------------------------------
$df -h
/opt/app/todeav/config#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2.0G 711M 1.2G 38% /
/dev/mapper/vg1-lv2 20G 3.8G 15G 21% /opt/applog
/dev/mapper/vg1-lv1 20G 13G 5.6G 70% /opt/app
查看当前目录所占空间大小:
du -sh
-h 人性化显示
-s 递归整个目录的大小
$du -sh
653M
查看当前目录下所有子文件夹排序后的大小:
for i in `ls`; do du -sh $i; done | sort
或者:
du -sh `ls` | sort
4.2 打包和压缩
打包是将多个文件归并到一个文件:
tar -cvf etc.tar /etc <==仅打包,不压缩!
-c :打包选项
-v :显示打包进度
-f :使用档案文件
注:有的系统中指定参数时不需要在前面加上-,直接使用tar xvf
示例:用tar实现文件夹同步,排除部分文件不同步:
tar --exclude '*.svn' -cvf - /path/to/source | ( cd /path/to/target; tar -xf -)
压缩
$gzip demo.txt
生成 demo.txt.gz
解包
tar -xvf demo.tar
-x 解包选项
解压后缀为 .tar.gz的文件 1. 先解压缩,生成**.tar:
$gunzip demo.tar.gz
解包:
$tar -xvf demo.tar
$bzip2 -d demo.tar.bz2
bz2解压:
tar jxvf demo.tar.bz2
如果tar 不支持j,则同样需要分两步来解包解压缩,使用bzip2来解压,再使用tar解包:
bzip2 -d demo.tar.bz2
-d decompose,解压缩
tar -xvf demo.tar
tar解压参数说明:
-z 解压gz文件
-j 解压bz2文件
-J 解压xz文件
- 查看磁盘空间 df -h
- 查看目录大小 du -sh
- 打包 tar -cvf
- 解包 tar -xvf
- 压缩 gzip
- 解压缩 gunzip bzip
五、进程管理
5.1 查询进程
查询正在运行的进程信息
$ps -ef
eg:查询归属于用户colin115的进程
$ps -ef | grep colin115
$ps -lu colin115
查询进程ID(适合只记得部分进程字段)
$pgrep 查找进程
eg:查询进程名中含有re的进程
[/home/weber#]pgrep -l re
2 kthreadd
28 ecryptfs-kthrea
29515 redis-server
以完整的格式显示所有的进程
$ps -ajx
显示进程信息,并实时更新
$top
查看端口占用的进程状态:
lsof -i:3306
查看用户username的进程所打开的文件
$lsof -u username
查询init进程当前打开的文件
$lsof -c init
查询指定的进程ID(23295)打开的文件:
$lsof -p 23295
查询指定目录下被进程开启的文件(使用+D 递归目录):
$lsof +d mydir1/
5.2 终止进程
杀死指定PID的进程 (PID为Process ID)
$kill PID
杀死相关进程
kill -9 3434
杀死job工作 (job为job number)
$kill %job
5.3 进程监控
查看系统中使用CPU、使用内存最多的进程;
$top
5.4 分析线程栈
使用命令pmap,来输出进程内存的状况,可以用来分析线程堆栈;
$pmap PID
[/home/weber#]ps -fe| grep redis
weber 13508 13070 0 08:14 pts/0 00:00:00 grep --color=auto redis
weber 29515 1 0 2013 ? 02:55:59 ./redis-server redis.conf
[/home/weber#]pmap 29515
29515: ./redis-server redis.conf
08048000 768K r-x-- /home/weber/soft/redis-2.6.16/src/redis-server
08108000 4K r---- /home/weber/soft/redis-2.6.16/src/redis-server
08109000 12K rw--- /home/weber/soft/redis-2.6.16/src/redis-server
将用户colin115下的所有进程名以av_开头的进程终止:
ps -u colin115 | awk '/av_/ {print "kill -9 " $1}' | sh
将用户colin115下所有进程名中包含HOST的进程终止:
ps -fe| grep colin115|grep HOST |awk '{print $2}' | xargs kill -9;
六、性能监控
6.1 监控CPU
查看CPU使用率
$sar -u
$sar -u 1 2
[/home/weber#]sar -u 1 2
Linux 2.6.35-22-generic-pae (MyVPS) 06/28/2014 _i686_ (1 CPU)
09:03:59 AM CPU %user %nice %system %iowait %steal %idle
09:04:00 AM all 0.00 0.00 0.50 0.00 0.00 99.50
09:04:01 AM all 0.00 0.00 0.00 0.00 0.00 100.00
6.2 查询内存
查看内存使用状况 sar指定-r之后,可查看内存使用状况;
$sar -r 1 2
09:08:48 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
09:08:49 AM 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
09:08:50 AM 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
Average: 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
查看内存使用量
$free -m
6.3 硬盘查询
查看磁盘空间利用情况
$df -h
查询当前目录下空间使用情况
du -sh -h是人性化显示 s是递归整个目录的大小
查看该目录下所有文件夹的排序后的大小
for i in `ls`; do du -sh $i; done | sort 或者 du -sh `ls`
七、网络管理
7.1 查询网络服务和端口
列出所有端口 (包括监听和未监听的):
netstat -a
列出所有 tcp 端口:
netstat -at
列出所有有监听的服务状态:
netstat -l
使用netstat工具查询端口:
$netstat -antp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 25501/redis-server
$ps 25501
PID TTY STAT TIME COMMAND
25501 ? Ssl 28:21 ./redis-server ./redis.conf
7.2 网络路由管理
查看路由状态:
$route -n
发送ping包到地址IP:
$ping IP
探测前往地址IP的路由路径:
$traceroute IP
DNS查询,寻找域名domain对应的IP:
$host domain
反向DNS查询:
$host IP
7.3 文件的下载
wget url
常用选项:
–limit-rate :下载限速
-o:指定日志文件;输出都写入日志;
-c:断点续传
7.4 服务器登入
SSH登陆:
$ssh ID@host
ssh登陆远程服务器host,ID为用户名。
ftp/sftp文件传输:
$sftp ID@host
登陆服务器host,ID为用户名。sftp登陆后,可以使用下面的命令进一步操作:
get filename # 下载文件
put filename # 上传文件
ls # 列出host上当前路径的所有文件
cd # 在host上更改当前路径
lls # 列出本地主机上当前路径的所有文件
lcd # 在本地主机更改当前路径
lftp同步文件夹(类似rsync工具):
lftp -u user:pass host
lftp user@host:~> mirror -n
7.5 网络复制
将本地localpath指向的文件上传到远程主机的path路径:
$scp localpath ID@host:path
以ssh协议,遍历下载path路径下的整个文件系统,到本地的localpath:
$scp -r ID@site:path localpath
八、用户权限管理
8.1 用户的增删
添加用户
$useradd -m username
该命令为用户创建相应的帐号和用户目录/home/username;
用户添加之后,设置密码:
密码以交互方式创建:
$passwd username
删除用户
$userdel -r username
不带选项使用 userdel,只会删除用户。用户的家目录将仍会在/home目录下。要完全的删除用户信息,使用-r选项;
帐号切换 登录帐号为userA用户状态下,切换到userB用户帐号工作:
$su userB
进入交互模型,输入密码授权进入;
8.2 用户分组
将用户加入到组
默认情况下,添加用户操作也会相应的增加一个同名的组,用户属于同名组; 查看当前用户所属的组:
$groups
一个用户可以属于多个组,将用户加入到组:
$usermod -G groupNmame username
变更用户所属的根组(将用加入到新的组,并从原有的组中除去):
$usermod -g groupName username
查看所有用户及权限:
$more /etc/passwd
查看所有的用户组及权限:
$more /etc/group
8.3 用户权限管理
使用chmod命令更改文件的读写权限,更改读写权限有两种方法,一种是字母方式,一种是数字方式
字母方式:
$chmod userMark(+|-)PermissionsMark
userMark取值:
u:用户
g:组
o:其它用户
a:所有用户
PermissionsMark取值:
r:读
w:写
x:执行
例如:
$chmod a+x main 对所有用户给文件main增加可执行权限
$chmod g+w blogs 对组用户给文件blogs增加可写权限
数字方式:
数字方式直接设置所有权限,相比字母方式,更加简洁方便;使用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
例如:
$chmod 740 main 将main的用户权限设置为rwxr-----
更改文件或目录的拥有者
$chown username dirOrFile
使用-R选项递归更改该目下所有文件的拥有者:
$chown -R weber server/
九、Linux工具的使用
9.1 查询程序依赖的库
查看test程序运行所依赖的库:
/opt/app/todeav1/test$ldd test
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003995400000)
第一列:程序需要依赖什么库
第二列: 系统提供的与程序需要的库所对应的库
第三列:库加载的开始地址
9.2 lsof文件管理
lsof打开的文件可以是:
- 普通文件
- 目录
- 网络文件系统的文件
- 字符或设备文件
- (函数)共享库
- 管道,命名管道
- 符号链接
- 网络文件(例如:NFS file、网络socket,unix域名socket)
- 还有其它类型的文件,等等
$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等:
实例2:查找某个文件相关的进程
$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:列出某个用户打开的文件信息
$lsof -u username
-u 选项,u是user的缩写
实例4:列出某个程序进程所打开的文件信息
$lsof -c mysql
-c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符;
实例5:列出某个用户以及某个进程所打开的文件信息
$lsof -u test -c mysql
实例6:通过某个进程号显示该进程打开的文件
$lsof -p 11968
实例7:列出所有的网络连接
$lsof -i
实例8:列出所有tcp 网络连接信息
$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:列出谁在使用某个端口
$lsof -i :3306
实例10:列出某个用户的所有活跃的网络端口
$lsof -a -u test -i
实例11:根据文件描述列出对应的文件信息
$lsof -d description(like 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
$lsof -i 4 -a -p 1234
实例13:列出目前连接主机nf5260i5-td上端口为:20,21,80相关的所有文件信息,且每隔3秒重复执行
lsof -i @nf5260i5-td:20,21,80 -r 3
9.3 PS进程查看器
实例1:显示所有进程信息
[root@localhost test6]# ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:01 migration/0
3 ? 00:00:00 ksoftirqd/0
4 ? 00:00:01 migration/1
5 ? 00:00:00 ksoftirqd/1
6 ? 00:29:57 events/0
7 ? 00:00:00 events/1
8 ? 00:00:00 khelper
49 ? 00:00:00 kthread
54 ? 00:00:00 kblockd/0
55 ? 00:00:00 kblockd/1
56 ? 00:00:00 kacpid
217 ? 00:00:00 cqueue/0
……省略部分结果
实例2:显示指定用户信息
[root@localhost test6]# ps -u root
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:01 migration/0
3 ? 00:00:00 ksoftirqd/0
4 ? 00:00:01 migration/1
5 ? 00:00:00 ksoftirqd/1
6 ? 00:29:57 events/0
7 ? 00:00:00 events/1
8 ? 00:00:00 khelper
49 ? 00:00:00 kthread
54 ? 00:00:00 kblockd/0
55 ? 00:00:00 kblockd/1
56 ? 00:00:00 kacpid
……省略部分结果
实例3:显示所有进程信息,连同命令行
[root@localhost test6]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 2 1 0 Nov02 ? 00:00:01 [migration/0]
root 3 1 0 Nov02 ? 00:00:00 [ksoftirqd/0]
root 4 1 0 Nov02 ? 00:00:01 [migration/1]
root 5 1 0 Nov02 ? 00:00:00 [ksoftirqd/1]
root 6 1 0 Nov02 ? 00:29:57 [events/0]
root 7 1 0 Nov02 ? 00:00:00 [events/1]
root 8 1 0 Nov02 ? 00:00:00 [khelper]
root 49 1 0 Nov02 ? 00:00:00 [kthread]
root 54 49 0 Nov02 ? 00:00:00 [kblockd/0]
root 55 49 0 Nov02 ? 00:00:00 [kblockd/1]
root 56 49 0 Nov02 ? 00:00:00 [kacpid]
实例4: ps 与grep 组合使用,查找特定进程
[root@localhost test6]# ps -ef|grep ssh
root 2720 1 0 Nov02 ? 00:00:00 /usr/sbin/sshd
root 17394 2720 0 14:58 ? 00:00:00 sshd: root@pts/0
root 17465 17398 0 15:57 pts/0 00:00:00 grep ssh
实例5:将与这次登入的 PID 与相关信息列示出来
[root@localhost test6]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 17398 17394 0 75 0 - 16543 wait pts/0 00:00:00 bash
4 R 0 17469 17398 0 77 0 - 15877 - pts/0 00:00:00 ps
实例6:列出目前所有的正在内存中的程序
[root@localhost test6]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 10368 676 ? Ss Nov02 0:00 init [3]
root 2 0.0 0.0 0 0 ? S< Nov02 0:01 [migration/0]
root 3 0.0 0.0 0 0 ? SN Nov02 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< Nov02 0:01 [migration/1]
root 5 0.0 0.0 0 0 ? SN Nov02 0:00 [ksoftirqd/1]
root 6 0.0 0.0 0 0 ? S< Nov02 29:57 [events/0]
root 7 0.0 0.0 0 0 ? S< Nov02 0:00 [events/1]
root 8 0.0 0.0 0 0 ? S< Nov02 0:00 [khelper]
root 49 0.0 0.0 0 0 ? S< Nov02 0:00 [kthread]
root 54 0.0 0.0 0 0 ? S< Nov02 0:00 [kblockd/0]
root 55 0.0 0.0 0 0 ? S< Nov02 0:00 [kblockd/1]
root 56 0.0 0.0 0 0 ? S< Nov02 0:00 [kacpid]
9.4 top linux中的任务管理器
实例1:多核CPU监控
在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况;
[rdtfr@bl685cb4-t ^]$ top
top - 09:10:44 up 20 days, 16:51, 4 users, load average: 3.82, 4.40, 4.40
Tasks: 1201 total, 10 running, 1189 sleeping, 0 stopped, 2 zombie
Cpu0 : 1.3%us, 2.3%sy, 0.0%ni, 96.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 1.3%us, 2.6%sy, 0.0%ni, 96.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 1.0%us, 2.0%sy, 0.0%ni, 92.5%id, 0.0%wa, 0.0%hi, 4.6%si, 0.0%st
Cpu3 : 3.9%us, 7.8%sy, 0.0%ni, 83.2%id, 0.0%wa, 0.0%hi, 5.2%si, 0.0%st
Cpu4 : 4.2%us, 10.4%sy, 0.0%ni, 63.8%id, 0.0%wa, 0.0%hi, 21.5%si, 0.0%st
Cpu5 : 6.8%us, 12.7%sy, 0.0%ni, 80.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 2.9%us, 7.2%sy, 0.0%ni, 85.3%id, 0.0%wa, 0.0%hi, 4.6%si, 0.0%st
Cpu7 : 6.2%us, 13.0%sy, 0.0%ni, 75.3%id, 0.0%wa, 0.0%hi, 5.5%si, 0.0%st
Mem: 32943888k total, 32834216k used, 109672k free, 642704k buffers
Swap: 35651576k total, 5761928k used, 29889648k free, 16611500k cached
实例2:高亮显示当前运行进程
在top基本视图中,按键盘“b”(打开/关闭加亮效果);
实例3:显示完整的程序命令
命令:top -c
[rdtfr@bl685cb4-t ^]$ top -c
top - 09:14:35 up 20 days, 16:55, 4 users, load average: 5.77, 5.01, 4.64
Tasks: 1200 total, 5 running, 1192 sleeping, 0 stopped, 3 zombie
Cpu(s): 4.4%us, 6.0%sy, 0.0%ni, 83.8%id, 0.2%wa, 0.0%hi, 5.5%si, 0.0%st
Mem: 32943888k total, 32842896k used, 100992k free, 591484k buffers
Swap: 35651576k total, 5761808k used, 29889768k free, 16918824k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2013 apache 18 0 403m 88m 5304 S 25.0 0.3 6:37.44 /usr/sbin/httpd
18335 pubtest 22 0 65576 996 728 R 7.8 0.0 0:00.24 netstat -naltp
16499 rdtfare 15 0 13672 2080 824 R 2.6 0.0 0:00.38 top -c
29684 rdtfare 15 0 1164m 837m 14m S 2.3 2.6 148:47.54 ./autodata data1.txt
12976 pubtest 18 0 238m 9000 1932 S 1.6 0.0 439:28.44 tscagent -s TOEV_P
实例4:显示指定的进程信息
命令:top -p pidid
/opt/app/tdv1/config#top -p 17265
top - 09:17:34 up 455 days, 17:55, 2 users, load average: 3.76, 4.56, 4.46
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.8%us, 1.9%sy, 0.0%ni, 89.2%id, 0.0%wa, 0.1%hi, 1.0%si, 0.0%st
Mem: 8175452k total, 8103988k used, 71464k free, 268716k buffers
Swap: 6881272k total, 4275424k used, 2605848k free, 6338184k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17265 tdv1 15 0 56504 828 632 S 0.0 0.0 195:53.25 redis-server
指定进程信息有多个时,需要结合其它工具将回车替换为,(-p 支持pid,pid,pid语法)
命令:top -p pgrep MULTI_PROCESS | tr “\n” ”,” | sed ‘s/,$//’
/opt/app/tdv1$top -p `pgrep java | tr "\\n" "," | sed 's/,$//'`
top - 14:05:31 up 53 days, 2:43, 9 users, load average: 0.29, 0.34, 0.22
Tasks: 3 total, 0 running, 3 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 8.2%sy, 0.0%ni, 86.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 66082088k total, 29512860k used, 36569228k free, 756352k buffers
Swap: 32767992k total, 1019900k used, 31748092k free, 15710284k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27855 rdtfare 20 0 4454m 1.3g 5300 S 0.7 2.0 338:31.37 java
2034 jenkins 20 0 18.3g 5.2g 5284 S 0.3 8.2 56:02.38 java 12156 rdtfare 20 0 4196m 1.2g 12m S 0.3 2.0 86:34.62 java
8.3. 更强大的工具
htop 是一个 Linux 下的交互式的进程浏览器,可以用来替换Linux下的top命令。
与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
与top相比,htop有以下优点:
- 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
- 在启动上,比top 更快。
- 杀进程时不需要输入进程号。
- htop 支持鼠标操作。
9.5 free 查询可用内存
free工具用来查看系统可用内存:
/opt/app/tdev1$free
total used free shared buffers cached
Mem: 8175320 6159248 2016072 0 310208 5243680
-/+ buffers/cache: 605360 7569960
Swap: 6881272 16196 6865076
9.6 vmstat 监视内存使用情况
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可实时动态监视操作系统的虚拟内存、进程、CPU活动。
vmstat [-V] [-n] [delay [count]]
-V表示打印出版本信息;
-n表示在周期性循环输出时,输出的头部信息仅显示一次;
delay是两次输出之间的延迟时间;
count是指按照这个时间间隔统计的次数。
/root$vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 0 27900472 204216 28188356 0 0 0 9 1 2 11 14 75 0 0
9 0 0 27900380 204228 28188360 0 0 0 13 33312 126221 22 20 58 0 0
2 0 0 27900340 204240 28188364 0 0 0 10 32755 125566 22 20 58 0 0
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
system:
in: 每秒中断数,包括时钟中断
cs: 每秒上下文切换数
CPU(以百分比表示)
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间
9.7 Wget下载命令
实例1:使用wget下载单个文件
$wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
说明:以上例子从网络下载一个文件并保存在当前目录,在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。
实例2:使用wget -O下载并以不同的文件名保存
$wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080
wget默认会以最后一个符合”/”的后面的字符来命令,对于动态链接的下载通常文件名会不正确。
实例3:使用wget –limit -rate限速下载
$wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip
当你执行wget的时候,它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件,而你还需要下载其它文件时就有必要限速了。
实例4:使用wget -c断点续传
$wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip
使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。
实例5:使用wget -b后台下载
$wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip
Continuing in background, pid 1840.
Output will be written to 'wget-log'.
对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载。
你可以使用以下命令来察看下载进度:
$tail -f wget-log
实例6:伪装代理名称下载
wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.minjieren.com/wordpress-3.1-zh_CN.zip
有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过–user-agent参数伪装。
实例7:使用wget -i下载多个文件
首先,保存一份下载链接文件,接着使用这个文件和参数-i下载:
$cat > filelist.txt
url1
url2
url3
url4
$wget -i filelist.txt
实例8:使用wget –mirror镜像网站
$wget --mirror -p --convert-links -P ./LOCAL URL
下载整个网站到本地
-miror:开户镜像下载
-p:下载所有为了html页面显示正常的文件
-convert-links:下载后,转换成本地的链接
-P ./LOCAL:保存所有文件和目录到本地指定目录
实例9: 使用wget -r -A下载指定格式文件
$wget -r -A.pdf url
可以在以下情况使用该功能:
下载一个网站的所有图片
下载一个网站的所有视频
下载一个网站的所有PDF文件
实例10:使用wget FTP下载
$wget ftp-url
$wget --ftp-user=USERNAME --ftp-password=PASSWORD url
可以使用wget来完成ftp链接的下载
使用wget匿名ftp下载:wget ftp-url
使用wget用户名和密码认证的ftp下载:wget –ftp-user=USERNAME –ftp-password=PASSWORD url
9.8 SCP 拷贝命令
scp [参数] [原路径] [目标路径]
-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port 注意是大写的P, port是指定数据传输用到的端口号
-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
实例1:从远处复制文件到本地目录
$scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/
说明: 从10.6.159.147机器上的/opt/soft/的目录中下载demo.tar 文件到本地/opt/soft/目录中
实例2:从远处复制到本地
$scp -r root@10.6.159.147:/opt/soft/test /opt/soft/
说明: 从10.6.159.147机器上的/opt/soft/中下载test目录到本地的/opt/soft/目录来。
实例3:上传本地文件到远程机器指定目录
$scp /opt/soft/demo.tar root@10.6.159.147:/opt/soft/scptest
说明: 复制本地opt/soft/目录下的文件demo.tar 到远程机器10.6.159.147的opt/soft/scptest目录
实例4:上传本地目录到远程机器指定目录
$scp -r /opt/soft/test root@10.6.159.147:/opt/soft/scptest
说明: 上传本地目录 /opt/soft/test到远程机器10.6.159.147上/opt/soft/scptest的目录中
9.9 Crontab定时任务
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
-u user:用来设定某个用户的crontab服务;
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
* */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7 * * * /etc/init.d/smb restart
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在crontab文件中定义多个调度任务时,需要特别注环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
- 脚本中涉及文件路径时写全局路径;
- 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
- 当手动执行脚本OK,但是crontab死活不执行时,很可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
博文参考
工具参考篇 — Linux Tools Quick Tutorial