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
命令转义:
[root@test root]# \command
这样就使用原来的命令而不是alias
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 基础命令练习
date | 日期 |
cal | 日历 |
bc | 计算器 |
Ctrl + c | 中断目前程序 |
Ctrl + d | 退出exit |
[Tab] | 命令与档案补全,ca[tab][tab] ,显示所有以ca开头的文件 |
q | 很多指令常定义的退出钮 |
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 C库调用─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
空格 | 下翻一页 |
[Page Up] | 上翻一页 |
[Page Down] | 下翻一页 |
[Home] | 第一页 |
[End] | 末页 |
/String | 向下查询String |
?String | 向上查询String |
n,N | n表示下一个匹配,N表示上一个匹配 |
q | 退出 |
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 | 向上查询String |
n,N | n表示下一个匹配,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)
tail: 只看结尾几行
#假设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)
统计命令使用频率
cat history.bak | awk '{for(i=1;i<=5;i++) $i=""; print}' | sort | uniq -c | sort -r -n > history.sort.bak
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/bashrc source /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 mks='make 2>&1 | grep -v "#warn" | grep '\''warning\|error\|undefined'\'''
#命令拓展
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
其中-d表示指定主目录,-m表示如果主目录不存在则新建主目录。
passwd book
设置密码
1.13 命令id
显示用户的ID,以及所属群组的ID。
#id root
uid=0(root) gid=0(root) groups=0(root)
1.14 命令who:查看谁在线
请使用who这个命令来查看当前正在登录的用户
[root@localhost http]# who
root tty1 Apr 9 13:17
http pts/0 Apr 16 15:13 (192.168.8.235)
http pts/1 Apr 16 15:13 (192.168.8.235)
1.16 命令screen:多窗口
功能说明:
使用telnet或SSH远程登录linux时,如果连接非正常中断(远程机器关闭),重新连接时,系统将开一个新的session,无法恢复原来的session.screen命令可以解决这个问题。Screen工具是一个终端多路转接器,在本质上,这意味着你能够使用一个单一的终端窗口运行多终端的应用。
我的用法:
1,开启一个screen并进入:
screen -S test1 #这里用-S表示给screen起名字,以后切换的时候比较方便。这时就进去了screen test1了。里面可以跑一些程序。
2,退出该screen:
Ctrl-a d #这里的ctrl-a表示同时按ctrl键和a键,然后再单独按d键。这时退到跟终端。
3,在根下查看开启的所有screen:
screen -ls # 比如会有25764.test1 (Detached)等。
4,在根下进入某个screen:
screen -r test1 #这时又进入到指定的screen session中,或者screen -r 25764。
5,关闭该session:
exit #在该screen中退出,退到根下。
6,强制连接,踢掉原来的
screen -D -r 20791
screen -x -r 20791(共享原来的)
7,当前窗口假死,强制关闭当前窗口,跳到下一个
Ctrl-a K
8,上翻
Ctrl-a Ctrl-[
语 法:
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]补充说明:
screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式的终端机时,才有可能用到screen程序。参 数:
-A 将所有的视窗都调整为目前终端机的大小。-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
常用screen参数:
C-a c -> Create,开启新的 window
C-a n -> Next,切换到下个 window
C-a p -> Previous,前一个 window
C-a 0..9 -> 切换到第 0..9 个window
Ctrl+a [Space] -> 由視窗0循序換到視窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里 每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令則可回去。
C-a w -> Windows,列出已开启的 windows 有那些
C-a t -> Time,显示当前时间,和系统的 load
C-a K -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上
C-a : ->输入命令(quit/split等):
除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。
--End--
~/.screenrc的配置
# ~/.screenrc
#
# 用系统的一些设置
shell -$SHELL
# 避免类似进入vi退出后屏幕刷新不完
altscreen on
#
# 启动时不显示欢迎屏幕
startup_message off
#
# hangup时自动detach
autodetach on
#
# 一个screen die,不冻结整个screen
nonblock on
#
# UTF-8 is necessary.
defutf8 on
#
# Change default scrollback value for new windows: scrollback 10000
defscrollback 10000
#
# start with visual bell as default
vbell off
vbell_msg "Bell on %t (%n)"
#
# 在最下一行显示窗口列表和时钟
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rY}%n %t%{-}%+w %=%{..G} %H(%l) %{..Y} %Y/%m/%d %c:%s "
#
# default windows
screen -t shell 0
screen -t vim 1
#
# 按 Ctrl-Z w 或 Ctrl-Z Ctrl-W 显示窗口列表
bind w windowlist -b
bind ^w windowlist -b
#
# 定义screen的功能键为Ctrl-Z。向终端输入Ctrl-Z时应按 Ctrl-Z z。默认是Ctrl-a
#escape ^Zz
【注】:
问题:
在使用screen的时候,相信不少同学碰到过这样的问题:使用screen启动一个新窗口之后,之前shell配置文件(比如:~/.bashrc)里定义的变量和alias全部失效。自己不得不使用“. ~/bashrc”又重新加载一遍配置,就这样,启动一个窗口,手动加载一次,非常繁琐麻烦。
解决方案:
在screen的配置文件.screenrc里增加配置项
shell -$SHELL
这句话的意思是:screen启动窗口后,自动加载当前shell的配置文件(比如:~/.bashrc),当然SHELL变量已经是定义好的
问题:
linux中显示中文OK:
echo $LANG
en_US.UTF-8
但是screen中不能正确显示中文,
解决方法:
设置~/.screenrc
defencoding GBK
encoding UTF-8 GBK
遇到一个问题,每次一关闭SecureCRT screen中的字体设置就有问题,需要重新关闭screen,再开启。【未解决】
5 系统服务
5.1 命令ps:进程管理
5.1.1 三种常用范式
#ps ux
查阅所有运行进程命令:
#ps aux
#ps -ef //多了一项ppid
#ps -axj //包括 PPID PID PGID SID
#ps -o pid,ppid,pgid,tpgid,sid,comm //指定选项
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 正在执行的命令行命令
STAT狀態位常見的狀態字符
D (Uninterruptible sleep)无法中断的休眠状态(通常 IO 的进程)【比如写core的时候】;
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
2.2 过滤命令:
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 -v grep | grep tester.py | awk'{print $2}' | wc -l
$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
分 时 日 月 周 |<=============指令串=============>|
第1列表示分钟1~59 每分钟用*或者 */1表示 |
第2列表示小时1~23(0表示0点) |
第3列表示日期1~31 |
第4列表示月份1~12 |
第5列标识号星期0~6(0表示星期天) |
第6列要运行的命令或脚本文件 |
特殊字符 | 代意义 |
*(星号) | 代表任何时刻。 如:52 12 * * * 表示任何月/周/日的5点52分 |
,(逗号) | 代表分隔时段。如: 52 5,22 * * *表示任何月/周/日的5点或22点52分 |
-(减号) | 代表一段时间范围内。如: 52 5-8 * * *表示任何月/周/日的5点到8点内每个小时的52分。 |
/n(斜线) | 每隔 n 单位。如:20 */2 * * * 表示任意月/周/日的2、4、6...24等点20分 |
一些例子:
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
/etc/crontab 文件使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。如果你想要增加一个任务到cron里,把运行任务的脚本(或者脚本的连接)放在对应的目录里;如果去掉run-parts这个参数的话,后面就可以写要运行的某个脚本的完整路径名,而不是文件夹名了。
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
说明:上面的 -l 表示让列表现示作业号的PID,另外(+-)号,(+)号表示默认的作业,如我在bash中输入fg,则[1] 会被自动执行。
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服务
概括为一般的步骤就是:写或找到该服务的启动脚本(不是简单的启动命令,而是有特定格式的),然后拷贝该文件到/etc/init.d/目录下,这个时候就可以用service name start来启动它了,因为service命令就是去查找该目录下的文件的。
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 已启动
例2:
【super deamon启动方式】查看 rsync 是否启动(rsync 是 super daemon 管理的),并将其设置为默认不启动,并关闭
#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 #查看发现的确关闭了
注:在linux 中
/etc/services 配置文件中记录了各个服务的端口号
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
跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。