如何实现部分编译:
1、只编译某子目录下的相关代码:
make dir/
make arch/
make drivers/net/
2、只编译部分模块
make M=drivers/net/
3、只编译某一模块
如:make drivers/net/pcnet32.ko
4、将编译完成的结果放置于别的目录中
make O=/tmp/kernel
5、cross compile:交叉编译
make ARCH=
脚本编译知识点:
1、变量中字符的长度:${#VARNAME}
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
例:[root@localhost ~]# A=3
[root@localhost ~]# echo ${A:-30}
3
[root@localhost ~]# unset A #取消A的赋值#
[root@localhost ~]# echo ${A:-30}
30
[root@localhost ~]# A=${A:-30}
[root@localhost ~]# echo $A
30
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
例:[root@localhost ~]# echo ${A:+30}
#值为空#
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
例:[root@localhost ~]# echo ${A:=30}
30
[root@localhost ~]# echo $A
30
${parameter:offset}:取子串,从offset处的后一个字符开始,取字串;
例:[root@localhost ~]# A='hello world'
[root@localhost ~]# echo ${A:2}
llo world
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的字串;
例:[root@localhost ~]# A='hello world'
[root@localhost ~]# echo ${A:2:3}
llo
3、脚本配置文件
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
例:[root@localhost ~]# vim a.conf
TEST="hello world."
[root@localhost ~]# vim a.sh
[root@localhost ~]# chmod +x a.sh
#!/bin/bash
#
. /root/a.conf #调用/root/a.conf#
TEST=${TEST:-info} #变量TEST赋值,TEST若有值则输出;否则输出info#
[ -n "TEST" ] && echo $TEST
[root@localhost ~]# ./a.sh
hello world.
4、局部变量
local VAR_NAME=
例1:[root@localhost ~]# vim b.sh
#!/bin/bash
#
a=1
test() {
a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
[root@localhost ~]# chmod +x b.sh
[root@localhost ~]# ./b.sh
7
8
9
10
例2:使用local局部变量
[root@localhost ~]# vim b.sh
#!/bin/bash
#
a=1
test() {
local a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
[root@localhost ~]# chmod +x b.sh
[root@localhost ~]# ./b.sh
1
2
3
4
5
6
7
8
9
10
5、命令mktemp
创建临时文件或目录
mktemp /tmp/file.XX #创建临时文件#
例:[root@localhost ~]# mktemp /tmp/file.XX
/tmp/file.89
[root@localhost ~]# mktemp /tmp/file.XXX
/tmp/file.090
[root@localhost ~]# mktemp /tmp/file.XXXX
/tmp/file.5092
[root@localhost ~]# FILE=`mktemp /tmp/file.XXXX`
[root@localhost ~]# echo $FILE
/tmp/file.5094
mktemp -d /tmp/file.XX #创建临时目录#
例:[root@localhost ~]# mktemp -d /tmp/file.XXX
/tmp/file.097
[root@localhost ~]# ls /tmp
file.097
6、信号
kill -SIGNAL PID
PID如下:
[root@localhost ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
脚本中,能实现信号捕捉,但9( 9) SIGKILL )和15( 15) SIGTERM)信号无法捕捉
trap命令:
trap 'COMMAND' 信号列表
例1:[root@localhost ~]# vim showdata.sh
#!/bin/bash
#
trap 'echo "You go...."' SIGINT #捕捉信号,执行输出“You go....”命令,致使ctrl+c中断命令失效#
while : ; do
date
sleep 2
done
[root@localhost ~]# chmod +x showdata.sh
[root@localhost ~]# ./showdata.sh
2017年 12月 24日 星期日 04:13:04 CST
2017年 12月 24日 星期日 04:13:06 CST
2017年 12月 24日 星期日 04:13:08 CST
2017年 12月 24日 星期日 04:13:10 CST
You go....
2017年 12月 24日 星期日 04:13:11 CST
2017年 12月 24日 星期日 04:13:13 CST
You go....
2017年 12月 24日 星期日 04:13:14 CST
2017年 12月 24日 星期日 04:13:16 CST
2017年 12月 24日 星期日 04:13:18 CST
[1]+ Stopped ./showdata.sh #Ctrl+z 转入后台运行#
[root@localhost ~]# kill %1 #终止后台脚本运行,1代表上行[1]#
例2:[root@localhost ~]# vim ping.sh
#!/bin/bash
#
NET=192.168.101
clearup() {
echo "quit..."
exit 1
}
trap 'clearup' SIGINT
for I in {1..100}; do
if ping -c 1 -W 1 $NET.$I $> /dev/null; then
echo "$NET.$I is up."
else
echo "$NET.$I is down."
fi
done
[root@localhost ~]# chmod +x ping.sh
[root@localhost ~]# ./ping.sh
ping: unknown host $
192.168.101.1 is down.
ping: unknown host $
192.168.101.2 is down.
quit...
例3:将ping结果传送到临时文件,实现终止程序并删除临时文件;
[root@localhost ~]# vim ping.sh
#!/bin/bash
#
NET=192.168.101
FILE=`mktemp /tmp/file.XXX`
clearup() {
echo "quit..."
rm -f $FILE
exit 1
}
trap 'clearup' SIGINT
for I in {1..100}; do
if ping -c 1 -W 1 $NET.$I $> /dev/null; then
echo "$NET.$I is up." | tee >> $FILE
else
echo "$NET.$I is down."
fi
done
[root@localhost ~]# chmod +x ping.sh
[root@localhost ~]# ./ping.sh
[root@localhost ~]# ./ping.sh
ping: unknown host $
ping: unknown host $
quit...
[root@localhost tmp]# ls #同时打开窗口,查看#
file.992
[root@localhost tmp]# ls #执行终止信号ctrl+c后,查看#
#为空#
7、一行执行多个语句,语句间用分号分隔
如语句:trap 'echo "quit.";exit 1' INT
8、任务计划
1、在未来的某个时间点执行一次某任务;
at
batch #不需要指定时间,自主决定在系统空闲时执行计划#
用法:
at 时间
at> COMMAND
at> Ctrl+d
at -l #显示作业列表相当于atq#
at -d AT_JOB_ID #删除某个作业,相当于atrm AT_JOB_ID#
例:
[root@localhost ~]# at now+3minutes
at> ls /var
at> cat /cat/fstab
at> #Ctrl+D 结束#
job 1 at 2017-12-24 15:13
[root@localhost ~]# at -l
1 2017-12-24 15:13 a root
指定时间:
绝对时间:HH:MM, DD:MM.YY , MM/DD/YY
相对时间:now+#
单位:minutes,hours,days,weeks
模糊时间:noon,midnight,teatime
命令的执行结果,将以邮件的形式
2、周期性的执行某任务;
cron:自身是一个不间断运行的服务
anacron:是cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务再恢复正常执行一次;
cron:
系统cron任务
定义在/etc/crontab
格式:分钟 小时 天 月 周 用户 任务
用户cron任务
定义在/var/spool/cron/USERNAME
格式:分钟 小时 天 月 周 任务
时间的有效取值:
分钟:0-59
小时:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
时间通配表示:
*:对应的所有有效取值
例:3 * * * * 表示每小时的第三分钟,即每小时执行一次
3 * * * * 表示每个周日的每小时的第三分钟
13 12 * * * 表示每天12点的第13分钟执行一次
13 12 6 * * 表示每月6号的12点第13分钟执行一次
,:离散时间点:
例:10,40 * * * 2,5 表示每周二、五每小时的第10、40分执行一次
-:连续时间点:
例:10 02 * * 1-5 表示每周一至五两点第10分执行一次
/:对应取值范围内没多久一次
例:*/3 * * * * 表示每3分钟执行一次
每两小时执行一次:01 */2 * * * 注:最小单位必须指定一个值,否则表示每两小时的每一秒执行一次
每两天执行一次:10 04 */2 * *
执行结果将以邮件形式发送给管理员,为避免这种情况出现可以使用重定向:
*/3 * * * * /bin/cat /etc/fstab > /dev/null 表示将表示每3分钟执行一次的正确结果重定向至/dev/null,保留错误结果
*/3 * * * * /bin/cat /etc/fstab &> /dev/null 表示将表示每3分钟执行一次的正确与错误的结果重定向至/dev/null
cron的环境变量:cron执行的所有命令都去PATH环境变量指定的路径下去找
cron PATH环境变量只有 /bin:/sbin:/usr/bin:/usr/sbin
cron 中的路径需要使用绝对路径,或在脚本中自定义环境变量,如系统cron:
[root@localhost ~]# vim /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
用户任务管理:
crontab
-l:列出当前用户的cron任务
例:[root@localhost ~]# crontab -l
no crontab for root
-e:编辑当前用户的cron任务
例:[root@localhost ~]# crontab -e
*/3 * * * * /bin/echo "how are ya?"
-r:移除当前用户所有任务
例:[root@localhost ~]# crontab -l
*/3 * * * * /bin/echo "how are ya?"
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root
-u USERNAME -l|-e|-r:管理指定用户的cron任务
例:[root@localhost ~]# id hadoop #查看是否存在hadoop用户#
uid=501(hadoop) gid=501(hadoop) groups=501(hadoop) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@localhost ~]# crontab -u hadoop -e
*/3 * * * * /bin/echo "How are ya?"
[root@localhost ~]# ls /var/spool/cron/
hadoop
[root@localhost ~]# su - hadoop
[hadoop@localhost ~]$ crontab -l
*/3 * * * * /bin/echo "How are ya?"
[root@localhost ~]# crontab -u hadoop -r #删除hadoop用户cron任务#
[root@localhost ~]# crontab -l
no crontab for root
anacron:
语法格式:
[hadoop@localhost ~]$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
查看cron是否运行:
[root@localhost ~]# service crond status
crond (pid 3494) 正在运行...
查看anacron是否运行:
[root@localhost ~]# service anacron status
anacron 已停
查看系统每个运行级别下cron是否运行:
[root@localhost ~]# chkconfig --list crond
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
阅读(1017) | 评论(0) | 转发(0) |