Linux命令简介
来源:互联网 发布:机械制图软件手机版 编辑:程序博客网 时间:2024/06/15 21:34
1 Linux命令简介
1.1 命令格式
- [root@test root]# command [-options] parameter1 parameter2 ...
- 指令 选项 参数(1) 参数(2)
说明:
1. 提示符:root账户提示符为#,一般身份用户提示符为$
2. 指令:区分大小写
3. 选项:可以使用-h或者--help
4. 指令太长:可使用\符号使指令连续到下一行
5. 使用分号表示连续执行:ll bashrc ; ll --time=atime bashrc ; ll --time=ctime bashrc
1.2 参数含义
一般来说,linux的命令参数有其一般含义:
- -f --force 略过不存在的文件,不显示任何信息
- -i --interactive 进行任何删除操作前必须先确认
- -r/R --recursive 同时删除该目录下的所有目录层
- -h --h是可以以k M G 等等为单位,不是只显示一个数字
- -h --help 显示此帮助信息并离开
- -v --verbose 详细显示进行的步骤
- -v --version 显示版本信息并离开
1.3 切换终端
切换文字终端和图形界面:
- [Ctrl] + [Alt] + [F1] ~ [F6] :文字界面登陆 tty1 ~ tty6 终端机;
- [Ctrl] + [Alt] + [F7] :图形桌面。
1.4 基础命令练习
1.5 linux快捷键
ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。
ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
ctrl-l 清屏
ctrl-r 逆向搜索包含输入字符串的命令,继续按 Ctrl+r,再向上搜索,可使用 Ctrl+c 中断命令
在终端直接上翻,下翻【比如ls输出太多,看不到上面显示的】
SHIFT+ PAGEUP
SHIFT + PAGEDOWN
1.6 linux查询命令man_info
/usr/man/man2 系统调用─关于核心函数的文档
/usr/man/man3 库调用─libc函数的使用手册页
/usr/man/man4 特殊文件─关于/dev目录中的文件的信息
/usr/man/man5 文件格式─/etc/passwd和其他文件的详细格式
/usr/man/man6 游戏
/usr/man/man7 宏命令包─对Linux文件系统、使用手册页等的说明
/usr/man/man8 系统管理─根操作员操作的使用手册页
/usr/man/man9 核心例程─关于Linux操作系统内核源例程或者内核模块技术指标的文档
- 查询linux c函数open
- #man 2 open
1.7 linux查看文件命令
1.7.1 直接查看cat_tac_nl
cat: 由第一行开始显示文件内容
- cat -n 显示行号
- cat -A 显示特殊字符
tac: 从最后一行开始显示文件内容,可以看出 tac 是 cat 倒写形式
nl : 显示的时候,顺便输出行号!
1.7.2 可翻页查看more_less
more: 一页一页的显示文件内容less:与more 类似,但是比 more 更好的是,他可以往前翻页!
空格下翻一页[Page Up]上翻一页[Page Down]下翻一页[Home]第一页[End]末页/String向下查询String?String向上查询Stringn,Nn表示下一个匹配,N表示上一个匹配q退出
1.7.3 数据选取head_tail
head: 只看头几行- #假设a.txt有100行
- head a.txt #默认显示前10行(L1~L10)
- head -n 20 a.txt #显示前20行(L1~L20)
- head -n -10 a.txt#打印末尾10行之前(L1~L90)
- #假设a.txt有100行
- tail a.txt #默认显示最后10行(L91~L100)
- tail -n 20 a.txt #显示最后20行(L81~L100)
- tail -n +50 a.txt #显示50行以后内容(L51~L100)
- tail -f tester.log #动态追踪tester.log的最后10行,直到用户输入Ctrl+c
- 查看a.txt的L11~L20
- head -n 20 a.txt | tail -n 10
1.8 命令file:查看文件类型
- file 文件名
- which cd #查找的是命令,参数-a将所有可以找到的指令均列出,而非第一个。
- whereis passwd #查找的是档案名(命令) 从数据库中找,快,非最新,系统的一般有,临时新建的不一定。不能通配符
- locate passwd #查找的是档案名(命令) 从数据库中找,快,非最新,系统的一般有,临时新建的不一定。不能通配符
- find /etc -name '*passwd*' #查找的是档案名(命令) 遍历硬盘,慢,最新,能通配符。
1.9 命令history:搜索历史命令
bash将使用过的旧命令记录在家目录下的~/.bash_history 文件下(默认1000条)。特别的,~/.bash_history 记录的是前一次登入以前所执行过的指令, 而至于这一次登入所执行的指令都被暂存在暂内存中,当您成功的注销系统后,该指令记忆才会记录到 .bash_history 当中!
- [root@linux ~]#history 3
利用history执行命令
- [root@linux ~]#!number
- [root@linux ~]#!command
- [root@linux ~]#!!
number:执行第几笔指令的意思;
command :由最近的指令向前搜寻"指令串开头为 command"的那个指令,并执行;
!!:就是执行上一个指令(相当于按↑按键后,按 Enter)
1.10 命令time:测量程序运行时间
- #time find . -name "mysql.sh"
- real 0m5.064s <== 实际使用时间(real time)
- user 0m0.020s <== 用户态使用时间(the process spent in user mode)
- sys 0m0.040s <== 内核态使用时间(the process spent in kernel mode)
1.11 命令alias:加入命令别名
系统设置永久,给全系统使用/etc/bashrcsource /etc/bashrc用户设置永久,给个人用户使用~/.bashrc
source /home/xxx/.bashrc 命令行设置临时,当次有效#alias cl='clear'
BASH Shell的配置文件:
1,系统设定值
所谓的系统设定值,也就是每个用户进入到bash shell之后先读取的配置文件.默认有以下几个:
(1),/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
(2),/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
(3),/etc/man.config: 此文件的内容规范了使用man时man page的路径在哪里.
2,个人设定值
个人设定值就是存在个人根目录的那几个隐藏文件.
(1),~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
(2),~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)
(3),~/.bash_history: 此文件用于记录曾经用过的命令.
(4),~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
3,加载过程
在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般还会有以下代码:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。
执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
常用的alias(可以作为临时alias,命令行输入)
- alias ..='cd ..'
- alias ...='cd ../..'
- alias cd..='cd ..'
- alias l='ls -lthr'
- alias la='ls -la'
- alias ll='ls -l'
- alias ls='ls --color'
- alias ls-l='ls -l'
- alias md='mkdir -p'
- alias rd='rmdir'
- alias mv='mv -i'
- alias cp='cp -i'
- alias rm='rm -i'
- alias mydf='df -h && df -ih'
- alias o='less'
- alias p='ps ux'
- alias cl='clear'
- alias vi='vim'
- #命令拓展
- alias datee='date +'\''%Y-%m-%d %H:%M:%S , tp=%s'\'''
- alias ip='/sbin/ifconfig | grep -a '\''inet addr'\'' | sed -e '\''/127\.0\.0\.1/d;s/.*inet addr:\([0-9\.]\+\).*/\1/'\'''
- #用户设置
- alias cci='cd /data/home/xxx/; ./cci.sh'
1.12 命令useradd
新加一个用户:
- useradd book -d /data/home/book -m
- passwd book
设置密码
1.13 命令id
显示用户的ID,以及所属群组的ID。
- #id root
- uid=0(root) gid=0(root) groups=0(root)
2 文件与目录管理
2.1 命令ls
ls=Listing Files/SubFolders:列出文件/子目录
ls
ls -al
ls -alh
参数 :
-a显示全部文件(包括.开头的隐藏文件)
-l比较详细的列表-h人类能看懂的比如把1024显示为1K
ls b*
列出以b开头的所有文件或文件夹(及其下的所有文件)
举例:
gexing111@gexing111-Lenovo-IdeaPad-Y470 ~ $ ls
Desktop latest.zip nox-dependencies.deb.1 Templates workspace
Documents Music Pictures test
Downloads newtxt Public Videos
eclipse nox-dependencies.deb swig-1.3.40 wordpress
其中有文件 latest.zip
则 :
gexing111@gexing111-Lenovo-IdeaPad-Y470 ~ $ ll l*
-rw-rw-r-- 1 gexing111 gexing111 4247824 2012-03-05 12:48 latest.zip
其中有文件夹Music
gexing111@gexing111-Lenovo-IdeaPad-Y470 ~ $ ll M*
total 0
-rw-rw-r-- 1 gexing111 gexing111 0 2012-03-09 14:31 1.txt
因为M开头的没有该文件,只有一个Music文件夹,这是唯一的,其实这时(M*)按Tab键就可以直接补全了,所以就不会显示文件夹名字。
其中的文件夹Pictures和Public都以P开头:
gexing111@gexing111-Lenovo-IdeaPad-Y470 ~ $ ll P*
Pictures:
total 456
-rw-rw-r-- 1 gexing111 gexing111 349353 2012-03-06 20:26 Screenshot at 2012-03-06 20:26:29.png
-rw-rw-r-- 1 gexing111 gexing111 105610 2012-03-08 23:12 Screenshot at 2012-03-08 23:12:19.png
Public:
total 0
注意 total是文件总大小。
有时ll是 ls -al的简写
- ls -Sl :按照文件大小大到小排序是
- ls -Slr :按照文件大小从小到大排就加个-r
所有参数 :
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来
-A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录,一起列出来
-l :除文件名称外,亦将文件类型、权限、拥有者、文件大小等信息详细列出
-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;
-r :将排序结果反向输出,例如:原本文件按英文字母顺序由小到大,反向则为由大到小;
-R :递归连同子目录内容一起列出来;
-t :依时间排序
2.2 命令cd
.. 代表上一层目录
- 代表前一个工作目录
~ 代表“目前用户身份”所在的主目录
~account 代表 account 这个使用者的主目录
与此相关的命令:
- cd [相对路径或绝对路径]
- cd #表示进入家目录
- cd ~ #表示进入家目录
- cd - #表示进入前一个目录
- cd .ssh #因为.ssh前面的点表示隐藏的文件夹 可以从 ls -al 看出来
2.3 命令pwd
- pwd [-P]
- pwd -P #-P表示打印真正的路径,而非链接路径。
2.4 命令mkdir
- mkdir [-mp] 目录名称
- mkdir -p test1/test2/test3 #-p表示递归的建立目录
- mkdir -m 711 test #-m表示建立目录同时设置权限
2.5 命令rmdir
- rmdir [-p] 目录名称
- rmdir -pv test1/test2/test3 #-p表示连同上层的空目录也一起删除; -v表示显示过程
2.6 命令rm
强制删除backup.zip这个文件并不需确认,列出删除文件列表,一般还是别强制删除,除非你知道你在干嘛…
-v一般v参数都是显示过程的意思
-f 一般force的意思,即强制删除
rm -rf backup
删除backup这个文件夹,包含它的子文件和子文件夹
删除文件用上面的命令,但删除文件夹的时候就需要跑下遍历了
-r 在所有命令里都是 recursive 的意思,有些命令是大写的 R 需要注意
2.7 命令mv
重命名backup.zip为sayhosts.com
如果加路径,就是移动到某个路径并重命名为sayhosts.com
2.8 命令cp
复制backup.zip这个文件并重命名为sayhosts.com
cp -r test test2
递归将文件夹test拷贝到test2
cp -a test test2
参数-a :相当于 -pdr 的意思,即递归将所有文件包括时间等属性都复制过来。
2.9 命令chmod:更改文件权限
chmod 777 backup.zip默认文件为644,文件夹为755,用这个命令就可以改成我们常用的777权限了
2.10 命令chown:更改属主
2.11 命令df:显示磁盘使用率
df -h显示整个主机的总容量以及比率
2.12 命令du:查看文件夹总容量
du -sh dir-s就是summary,只输出当前文件夹总容量
-h一般在linux就是human给人看的意思,会把1048580b转换为1mb显示
du -h --max-depth=1
只列出当前文件夹和第一级子目录占用大小
而用ls dir的话只是列出其目录(而非其下所有文件)的大小,一般一个目录大小<=4K都记为4K。
2.12 命令ln:硬链接软链接
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。
前提必须清楚一点,当指向数据的文件个数为0 时,数据块就会被释放掉,硬链接相当于硬盘上一块数据的多个指针,而软链接相当于指向数据指针的指针。
【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
实验
- [oracle@Linux]$ touch test #创建一个测试文件test
- [oracle@Linux]$ ln test f1 #创建test的一个硬连接文件f1
- [oracle@Linux]$ ln -s test f2 #创建test的一个软连接文件f2(符号链接)
- [oracle@Linux]$ ls -li # -i参数显示文件的inode节点信息
- total 0
- 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 test
- 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
- 9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f2 -> test
从上面的结果中可以看出,硬连接文件f1与原文件test的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。
- [oracle@Linux]$ echo "I am test file" >>test
- [oracle@Linux]$ cat test
- I am test file
- [oracle@Linux]$ cat f1
- I am test file
- [oracle@Linux]$ cat f2
- I am test file
- [oracle@Linux]$ rm -f test
- [oracle@Linux]$ cat f1
- I am test file
- [oracle@Linux]$ cat f2
- cat: f2: No such file or directory
总结
依此您可以做一些相关的测试,可以得到以下全部结论:
1).删除符号连接f2,对test,f1无影响;
2).删除硬连接f1, 对test,f2也无影响;
3).删除原文件test,对硬连接f1没有影响,导致符号连接f2失效;
4).同时删除原文件test,硬连接f1,整个文件会真正的被删除。
使用
比如我要建立一个目录 xiaobao->/asp/disk8/xiaobao
- [admin@r42h06021.xy2.xxx.com]$df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/sdb1 1.8T 13G 1.8T 1% /aps/disk1
- /dev/sdc1 1.8T 13G 1.8T 1% /aps/disk2
- /dev/sdd1 1.8T 13G 1.8T 1% /aps/disk3
- [admin@r42h06021.xy2.xxx.com]$cd /aps/disk3
- [admin@r42h06021.xy2.xxx.com]$mkdir xiaobao
- [admin@r42h06021.xy2.xxx.com]$cd -
- [admin@r42h06021.xy2.xxx.com]$ln -s /aps/disk3/xiaobao xiaobao
- [admin@r42h06021.xy2.aliyun.com]$ll
- lrwxrwxrwx 1 admin admin 30 Nov 20 11:31 xiaobao -> /apsarapangu/disk3/xiaobao
2.13 命令dd:指定块拷贝
dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
- #创建一个100M的空文件
- dd if=/dev/zero of=hello.txt bs=100M count=1
2.14 命令mount:挂载设备
以Linux挂载U盘为例(默认设备最开始在/dev/下,需要挂载到/mnt/usb下):
1、插入u盘到计算机,如果目前只插入了一个u盘而且你的硬盘不是scsi的硬盘接口的话,那它的硬件名称为:sda1。
2、在mnt目录下先建立一个usb的目录 mkdir /mnt/usb
3、挂载U盘:mount -t vfat /dev/sda1 /mnt/usb
4、卸载U盘:umount /mnt/usb
5、删除usb目录:rm -rf /mnt/usb
3 基本命令
3.1 shell脚本:在一堆JAR包中找CLASS
for f in `find *.jar`; do jar tvf $f |grep -i GrammarSanity.class ; echo $f; done
find ./lib/*
3.2 命令wget :获取远程文件
wget http://wordpress.org/latest.zip
这样便可以非常方便的将wordpress最新版下载到服务器上当前目录,免去了下载、上传的麻烦。而且通过服务器去另外的服务器下载东东.3.3 命令tar:压缩/解压缩
• *.Z compress 程序压缩的文件;
• *.bz2 bzip2 程序压缩的文件;
• *.gz gzip 程序压缩的文件;
• *.tar tar 程序打包的文件,并没有压缩过;
• *.tar.gz tar 程序打包的文件,并且经过 gzip 的压缩
- unzip latest.zip
如果压缩文档是zip格式的,那么就可以用unzip这个命令来解压。
- tar -czvf backup.tar.gz *
-c创建
-z用gzip压缩方式
-v显示压缩过程
-f后接文件名
- tar -xzvf backup.tar.gz
-x解压缩
-z用gzip压缩方式
-v显示压缩过程
-f后接文件名
3.4 命令uniq:进行文本排序
文本内容:
- good
- nice
- room
- nice
- nice
- good
进行排序,并统计单词数目:
- sort 1.txt | uniq -c | sort -n -r | tee 2.txt
- good
- good
- nice
- nice
- nice
- room
然后进行uniq -c 统计:
- 2 good
- 3 nice
- 1 room
- 3 nice
- 2 good
- 1 room
3.5 命令tail:即时显示文件内容
- tail -f tester.log
3.6 命令reset:shell屏幕字符乱掉
- reset
3.7 命令xargs:过滤器
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
- find . -name "*.py" | xargs ls –l
如果“find . -name "*.py"”有两个结果a.py和b.py。那么这里xargs的作用就是将这两个结果分割并传递给ls -l。【结果默认都在结尾!】所以这里相当于:
- ls -l a.py
- ls -l b.py
xargs+cp/mv
因为这种的结果都不是在末尾处,而是在cp/mv命令的中间。
- find . -newer meta.h | xargs -i{} cp {} ../testMYSQL/
- find . -newer meta.h | while read line; do mv $line ../testMYSQL/ ; done
3.8 命令md5sum:检验两个文件是否相同
如检验Jar包是否更新过代码
- [admin@r42h06016.xy2.xxx.com]$md5sum myJar.jar
- 061ea1d09a2e52036359a008e27efefe myJar.jar
也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个sh文件,要把这几个sh文件的摘要输出到sh.md5文件中,命令如下:
- [admin@r42h06016.xy2.xxx.com]$md5sum *.sh > sh.md5
- c79f5d1a2625475790ac374b6a92cded oneKey.sh
- 412b7b3fdfdbc9ef493e6cde3fa3254f run_mr.sh
- e63c74df12477857364db4c0245559da trans_file.sh
3.9 命令grep:文本字符串查找
- cat file | grep -i '\<nice\>'
-i选项忽略大小写,一般正则表达式用单引号‘ ’括起来,后面的‘\<word\>’是正则表达式匹配一个完成单词,前后有空格的。
- ps aux| grep -v grep | grep python
-v选项表示反选后面的单词
命令格式:
- [root@linux ~]# grep [-acinv] 'pattern' filename
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
3.10 命令cut:文本行处理
- [root@linux ~]# cut -d '分隔字符' -f fields
- [root@linux ~]# cut -c 字符区间
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
示例1:将 PATH 变量取出,我要找出第三个路径。
- [root@linux ~]# echo $PATH
- /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
- [root@linux ~]# echo $PATH | cut -d ':' -f 5 #以:作为分隔符,取第5个,输出:/usr/local/bin
- [root@linux ~]# echo $PATH | cut -d ':' -f 3,5 #取第3个~第5个
- [root@linux ~]# export
- declare -x HISTSIZE="1000"
- ......其它省略......
- [root@linux ~]# export | cut -c 12-
- HISTSIZE="1000"
- ......其它省略......
- # 知道怎么回事了吧?用 -c 可以处理比较具有格式的输出数据!我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 等等!
3.11 命令awk:文本行处理
- awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
- $awk -F: '$2!="x" {printf("%s no password!\n",$1)}' /etc/passwd
- $awk '/sun/{print}' mydoc
其中-F 表示用什么来分割字段,'prog'= 'pattern {action}' 用来处理以什么模式来匹配,和怎么进行处理。
3.12 命令sed:文本行处理
- sed [options] 'command' file(s)
将文件第20行~第80行转存到1.txt sed
- $sed -n '20,80p' home/temp.txt > 1.txt
所有以file开头的文件中的a都替换为b:
- $sed -i "s/a/b/g" file*
3.13 命令find:递归搜索文件名
- find <指定目录> <指定条件> <指定动作>
- $find /tmp -name "*.sh" -ls
- $find . -iname abcd
3.14 命令tee:打印并同时输出到文件
tee 命令读取标准输入,然后将程序的输出写到标准输出,并同时将其复制到指定的一个或多个文件。
主要参数
-a 将输出添加到 File 的末尾而不是覆盖写入。
-i 忽略中断
实验
1,要同时查看和保存一个命令的输出:
- lint program.c | tee program.lint
2,要同时查看一个命令的输出并保存到一个现有文件:
- lint program.c | tee -a program.lint
3,同时拷贝三份文件
- cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3
3.15 命令diff_patch:比较文件并打补丁
diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。
一般A是原始文件,B是修改后的文件,C称为A的补丁文件。
- #修改文件B - 原文件A = 补丁文件C
- diff A B >C
- #原文件A + 补丁文件C = 修改文件B(此时A被覆盖)
- patch A C
- #修改文件B - 补丁文件C = 原文件A(此时B被覆盖)
- patch -R B C
3.16 命令pstack:查看某进程下所有线程
Linux下打印出他所有线程的调用栈,从栈再配合程序代码就知道程序行为。事实上pstack雷人的是,这个程序竟然是个shell脚本,核心实现是gdb的 thread apply all bt。
查看某进程号pid下所有线程:
- pstack pid
3.17 命令jar:打成jar包
JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件,准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。
创建Jar包:
- jar -cvfM0 test.jar ./*
-v 显示过程信息
-f 指定 JAR 文件名,通常这个参数是必须的
-M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数
-0 数字0,表示只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
解压Jar包:
- jar -xvf test.jar
-v 显示过程信息
-f 指定 JAR 文件名,通常这个参数是必须的
列出目录:
- jar -tf test.jar
-f 指定 JAR 文件名,通常这个参数是必须的
将两个Jar包合并为一个:
先将两个Jar包都解压,然后再打成一个,注意,里面的MANIFEST可以不要,即重新打包的时候不需要参数-M了。
- jar -xvf gson-1.7.1.jar#得到META-INF和com
- rm -rf META-INF
- jar -xvf log4j-1.2.16.jar#得到META-INF和org
- rm -rf META-INF
- jar -cvf my.jar com org#将com和org打包成my.jar
3.18 命令java -cp:爪哇运行Jar包
- java -cp .:./*:./lib/* package.app.Tool -f ./1.file
3.19 命令scp:远程传输文件
1,从本地服务器复制到远程服务器
scp local_file remote_username@remote_ip:remote_folder
- #scp /home/administrator/news.txt root@192.168.6.129:/etc/squid
scp remote_username@remote_ip:remote_folder local_file
- #scp remote@www.abc.com:/usr/local/sin.sh /home/administrator
5 系统服务
5.1 命令ps:进程管理
5.1.1 三种常用范式
- #ps -l
- #ps aux
- 或者
- #ps -ef
5.1.2 “ps aux” 说明
“ps -ef”比“ps aux”多一项PPID- $ps aux |more
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- root 1 0.0 0.0 10348 624 ? Ss Apr29 0:22 init [3]
- root 2 0.0 0.0 0 0 ? S< Apr29 0:40 [migration/0]
- root 3 0.0 0.0 0 0 ? SN Apr29 0:25 [ksoftirqd/0]
- root 4 0.0 0.0 0 0 ? S< Apr29 0:00 [watchdog/0]
- root 5 0.0 0.0 0 0 ? S< Apr29 0:12 [migration/1]
- root 6 0.0 0.0 0 0 ? SN Apr29 0:18 [ksoftirqd/1]
- root 7 0.0 0.0 0 0 ? S< Apr29 0:00 [watchdog/1]
- root 8 0.0 0.0 0 0 ? S< Apr29 0:10 [migration/2]
- root 9 0.0 0.0 0 0 ? SN Apr29 0:16 [ksoftirqd/2]
- root 10 0.0 0.0 0 0 ? S< Apr29 0:00 [watchdog/2]
- USER 用户名
- PID 进程ID(Process ID)
- PPID 父进程的进程ID(Parent Process id)
- %CPU 进程的cpu占用率
- %MEM 进程的内存占用率
- VSZ 进程所使用的虚存的大小(Virtual Size)
- RSS 进程使用的驻留集大小或者是实际内存的大小,Kbytes字节
- TTY 与进程关联的终端(tty),若与终端无关,则显示(?),否则显示类似(pts/0)等
- STAT 进程的状态:进程状态使用字符表示的(STAT的状态码)
- START 进程启动时间和日期
- TIME 进程使用的总cpu时间
- COMMAND 正在执行的命令行命令
- D (Uninterruptible sleep)无法中断的休眠状态(通常 IO 的进程);
- R (Runnable)正在运行或在运行队列中等待
- S (Sleeping)休眠中, 受阻, 在等待某个条件的形成或接受到信号
- T (Terminate)停止或被追踪;
- W 进入内存交换 (从内核2.6开始无效);
- X 死掉的进程 (基本很少見);
- Z (Zombie)僵尸进程;
- < 优先级高的进程
- N 优先级较低的进程
- L 有些页被锁进内存;
- s 进程的领导者(在它之下有子进程);
- l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
- + 位于后台的进程组;
5.1.3 未知执行命令时:pgrep
- $ pgrep chrome
- 32575
- 32580
- ...
或使用pstree查看
- $ pstree -p | grep chrome
- |-chrome-sandbox(32582)---chrome(32583)-+-chrome(32622)-+-{chrome}(32625)
- | | |-{chrome}(32627)
- ...
5.1.4 已知执行命令时:ps
2.1 直接查找命令:
【已知:跑了以python2.7开头的很多命令】
ps -ef | grep python2.7
- $ps -ef | grep python2.7
- admin 18535 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18536 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18537 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18538 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18539 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 19218 8361 0 14:24 pts/0 00:00:00 grep python2.7
ps -ef | grep python2.7 | grep -v grep | grep tester.py
- $ps -ef | grep python2.7|grep tester.py
- admin 18535 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18536 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18537 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18538 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
- admin 18539 18484 0 14:22 pts/9 00:00:00 python2.7 tester.py sql_case/ plan run
2.3 打印进程号:
ps -ef | grep python2.7| grep -v grep | grep tester.py | awk'{print $2}'
- $ps -ef | grep python2.7|grep tester.py | awk '{print $2}'
- 18535
- 18536
- 18537
- 18538
- 18539
- $ps -ef | grep python2.7|grep tester.py | awk '{print $2}'| wc -l
- 5
2.4 杀死进程
ps -ef | grep python2.7| grep -v grep | grep tester.py | awk'{print $2}' | xargs kill -9
- $ps -ef | grep python2.7|grep tester.py | awk '{print $2}'| xargs kill -9
【另,如果确认之生成了进程python2.7 balabala】
亦可以killall python2.7
5.1.5 杀死进程:kill_killall
强制杀掉父进程
- $ kill -9 32582
- $ kill -HUP 32582
- $ kill -1 32582
- $ killall chrome
5.2 命令crontab:定时作业
1,命令at:脱机+仅执行一次的job调度
- 例1:5分钟后,将 /root/.bashrc 寄给 root 自己
- [root@www ~]# at now + 5 minutes
- at> /bin/mail root -s "testing at job" < /root/.bashrc
- at> <EOT> <==这里输入 [ctrl] + d 就会出现 <EOF> ,代表结束!
- job 4 at 2009-03-14 15:38
- # 说明第 4 个 at 工作将在 2009/03/14 的 15:38 进行!
- 例2:设置 2009/03/17 23:00 关机?
- [root@www ~]# at 23:00 2009-03-17
- at> /bin/sync
- at> /bin/sync
- at> /sbin/shutdown -h now
- at> <EOT>
- job 5 at 2009-03-17 23:00
2,命令crontab:循环执行例行性job
- crontab [-u username] [-l|-e|-r]
- -u :root帮其他使用者建立/移除 crontab 工作排程;
- -e :编辑 crontab的内容
- -l :查阅 crontab 的内容
- -r :移除所有的 crontab 的内容。(若仅要移除一项,请用 -e 去编辑)
针对用户的例行性job:
- #crontab -e
- * * * * * /usr/local/src/analog-5.32-lh/analog
- 分 时 日 月 周 |<=============指令串=============>|
一些例子:
- 30 21 * * * /usr/local/etc/rc.d/lighttpd restart
- 上面的例子表示每晚的21:30重启apache。
- 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
- 上面的例子表示每月1、10、22日的4 : 45重启apache。
- 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
- 上面的例子表示每周六、周日的1 : 10重启apache。
- 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
- 上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
- 0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
- 上面的例子表示每星期六的11 : 00 pm重启apache。
- * */1 * * * /usr/local/etc/rc.d/lighttpd restart
- 每一小时重启apache
- * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
- 晚上11点到早上7点之间,每隔一小时重启apache
- 0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
- 每月的4号与每周一到周三的11点重启apache
- 0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
- 一月一号的4点重启apache
针对系统的例行性job:
- #cat /etc/crontab
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root #如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
- HOME=/ #使用者运行的路径,这里是根目录
- # run-parts
- 01 * * * * root run-parts /etc/cron.hourly
- 02 4 * * * root run-parts /etc/cron.daily
- 22 4 * * 0 root run-parts /etc/cron.weekly
- 42 4 1 * * root run-parts /etc/cron.monthly
3,命令\&:后台提交作业
- command &
4,命令nohup:脱机+后台提交作业
- nohup command &
5.3 命令jobs:作业管理
1,作业放在后台运行:&
- #command &
- [1] 234 # [job number] PID
2,作业放到后台并暂停:Ctrl+z
- #command
- [Ctrl+z]
- [1]+ Stopped ...
3,观察当前后台作业状况:jobs
- #jobs -l
- [1]+ Stopped /usr/bin/vim /etc/profile
- [2]- Stopped /usr/bin/vim /etc/profile.conf
4,后台作业拿到前台处理:fg
- #fg %jobnumber
5,让作业在后台运行:bg
- #bg %jobnumber
6,杀死后台作业:kill
- #kill -9 %jobnumber #-9:立刻强制删除一个作业
- #kill -15 %jobnumber #-15:以正常的程序方式终止一项作业.
5.4 命令chkconfig:将服务加入开机自启动
用法:
- # chkconfig --list #查看系统中所有的服务在各个运行等级的情况。
- NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
- acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
- auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- #chkconfig --list mysqld #查看系统中特定的服务在各个运行等级的情况。
- mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
一般情况下在linux 系统中有7 个run levels。run level 的意思就是定义什么服务或者进程运行在系统中。每个运行等级在系统启动的时候启动的进程数量或者服务是不同的,所以这个运行等级是和服务进程密切相关的。init 进程一次只能运行在一个run level。
- --level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关毕。
- 等级0表示:表示关机
- 等级1表示:单用户模式
- 等级2表示:无网络连接的多用户命令行模式
- 等级3表示:有网络连接的多用户命令行模式(文本模式)
- 等级4表示:不可用
- 等级5表示:带图形界面的多用户模式(图形模式)
- 等级6表示:重新启动
大部分的桌面系统都启动到运行等级5。大部分的服务器系统都启动到运行等级3。/etc/inittab 配置文件用户设置系统默认启动到的运行等级。
- #chkconfig mysqld on #启动mysqld服务。也可以后加--level 3
5.5 命令service:管理linux服务(其实是去/etc/init.d下读脚本)
service 使用这个命令来启动关闭服务只在本次系统运行期间有效,系统关闭重启以后上次所做的设置就无效了。
用file命令查看此命令会发现它是一个脚本命令(命令位于/sbin/service)。分析脚本可知此命令的作用是去/etc/init.d目录下寻找相应的服务,然后调用该服务脚本来进行开启和关闭等操作。强烈建议大家将service命令替换为/etc/init.d/mysqld stop (因为有一些linux的版本不支持service),即:service mysqld start == /etc/init.d/mysqld start。
/etc/init.d目录在Linux系统中可是大名鼎鼎。它只负责一件事情,但却涉及到全系统。它包含系统中各种服务的start/stop脚本。init.d初始化脚本称之为System V风格初始化,是System V系统传统之一,后来成为一些Unix系统的共同特性的源头。
/etc/init.d这个目录下的脚本就类似于windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),有选择的(根据运行级别)执行其中的服务脚本,因为系统并不需要启动所有的服务。
例如:开启httpd服务器
- #service httpd {start|stop|status|restart|reload|force-reload}
主要选项包括:start表示启动,restart表示重新启动,stop表示关闭,reload表示重新载入配置,status表示给出状态。
如何知道现在系统中在跑的服务有那些?
- #service --status-all| grep running
如何知道服务的名字?
你当然可以ll /etc/init.d
如果没有在/etc/init.d下找到服务脚本?
- cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql #把msql的脚本文件拷到系统的启动目录下
- chkconfig --add mysql #将mysql加到启动服务列表里
- chkconfig mysql on #让系统启动时自动打开mysql服务
service命令和chkconfig命令重启的区别?
service xxx start/stop 即刻生效,重启后失效
chkconfig xxx on/off 重启后永久生效
完整的服务测试流程
例1:【stand alone 的启动方式】观察 httpd ,再观察默认有无启动,之后以 chkconfig 配置为默认启动,并立即启动
- #/etc/init.d/httpd status #查看发现该服务已停止
- httpd 已停止
- #chkconfig --list httpd #查看发现不是默认开机自启动的
- httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
- #chkconfig httpd on; chkconfig --list httpd #配置为默认开机自启
- httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- #/etc/init.d/httpd start #配置为立刻启动
- # /etc/init.d/httpd status #查看状态发现的确开启了
- httpd 已启动
- #netstat -tlup | grep rsync #查看发现的确是由xinetd管理的,并且开启着
- tcp 0 0 192.168.201.110:rsync *:* LISTEN 4618/xinetd
- tcp 0 0 www.vbird.tsai:rsync *:* LISTEN 4618/xinetd
- #chkconfig --list rsync #查看发现时默认自启动的
- rsync on
- #chkconfig rsync off; chkconfig --list rsync #配置为默认开机不启动
- rsync off
- #/etc/init.d/xinetd restart #配置立刻重启(注意是xinetd)
- #netstat -tlup | grep rsync #查看发现的确关闭了
1,stand alone (服务可单独启动)
各服务脚本位置:/etc/init.d/*
各服务初始化配置文件:/etc/sysconfig/*
各服务各自的配置文件:/etc/*.conf
各服务启动方式:/etc/init.d/mysqld start 或用 service mysqld start
xinet(超级守护进程)本身是一个stand alone的服务:
xinetd脚本位置:/etc/init.d/xinet
xinetd配置文件:/etc/xinet.conf
xinetd启动方式:/etc/init.d/xinet start 或用 service xinetd restart
2,super daemon (透过 xinetd 统一管理的服务) ,它是经过一个统一的 xinetd 来管理,因此可以具有类似防火墙管理功能。此外,管理的联机机制又可以分为 multi-threaded 及 single-threaded。
各服务初始化配置文件:xinetd管理的其他子服务的配置文件/etc/xinetd.d/*
启动方式:/etc/init.d/xinetd restart
5.6 命令strace:查看系统调用
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
- >>strace touch 3.txt
- execve("/usr/bin/touch", ["touch", "3.txt"], [/* 63 vars */]) = 0
- brk(0) = 0x50a000
- mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9f5745a000
- uname({sys="Linux", node="Tencent64", ...}) = 0
- access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
- open("tls/x86_64/librt.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
- open("tls/librt.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
常用参数:
- -c 统计每一系统调用的所执行的时间,次数和出错的次数等.
- -t 在输出中的每一行前加上时间信息.
- -tt 在输出中的每一行前加上时间信息,微秒级.
- -ttt 微秒级输出,以秒了表示时间.
- -T 显示每一调用所耗的时间.
- -e trace=set
- 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
- -e trace=file
- 只跟踪有关文件操作的系统调用.
- -e trace=process
- 只跟踪有关进程控制的系统调用.
- -e trace=network
- 跟踪与网络有关的所有系统调用.
- -e strace=signal
- 跟踪所有与系统信号有关的 系统调用
- -e trace=ipc
- 跟踪所有与进程通讯有关的系统调用
- -e abbrev=set
- 设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
- -e raw=set
- 将指 定的系统调用的参数以十六进制显示.
- -e signal=set
- 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
- -e read=set
- 输出从指定文件中读出 的数据.例如:
- -e read=3,5
- -e write=set
- 输出写入到指定文件中的数据.
- -o filename
- 将strace的输出写入文件filename
- -p pid
- 跟踪指定的进程pid.
- #strace -o output.txt -T -tt -e trace=all -p 28979
- Linux关机命令简介
- Linux部分命令简介
- Linux Shell 命令 简介
- linux: source 命令简介
- Linux若干命令简介
- linux less命令简介
- Linux命令简介
- linux top命令简介
- linux wc 命令简介
- linux find命令简介
- linux tar命令简介
- linux dd命令简介
- linux less命令简介
- linux less命令简介
- Linux命令简介
- Linux命令简介
- Linux tr命令简介
- Linux命令简介
- 如何使用UDP进行跨网段广播
- eclipse下切换svn用户
- 关于java response的两种页面输出方式,以及HttpUrlconnection 代理使用注意点
- weka基本知识
- Spring3 MVC 笔记(一)
- Linux命令简介
- EasyUI的一些封装方法
- poj1704
- 为什么要报考系统架构设计师考试
- IOS 开发必备网址
- 用数组元素做函数实参
- 转载的一篇关于如何优化JAVA代码及提高效率的文章
- sublime使用代理服务器安装package control
- CentOS yum安装mcrypt详细图解教程-magento