摘要

本博文主要是介绍的操作系统中的实战,帮助大家在操作服务器做一个参考。

操作系统——linux命令实战_Windows

一、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打开的文件可以是:

  1. 普通文件
  2. 目录
  3. 网络文件系统的文件
  4. 字符或设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 网络文件(例如:NFS file、网络socket,unix域名socket)
  9. 还有其它类型的文件,等等
$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点:

  1. 脚本中涉及文件路径时写全局路径;
  2. 脚本执行要用到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 &
  1. 当手动执行脚本OK,但是crontab死活不执行时,很可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

博文参考

Linux学习教程,Linux入门教程(超详细)

工具参考篇 — Linux Tools Quick Tutorial