编写服务脚本/root/bin/testsrv.sh和备份脚本/root/bin/copycmd.sh

编写服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数:start, stop, restart, status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”

考虑:如果事先已经启动过一次,该如何处理?

(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”

考虑:如果事先已然停止过了,该如何处理?

(5) 如是restart,则先stop, 再start

考虑:如果本来没有start,如何处理?

(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running…”

如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”

其中:SCRIPT_NAME为当前脚本名

prog=$0
lockfile=/var/lock/subsys/$prog
cat << EOF
enter your optipn
=================
start)
stop)
restart)
status)
quit)
================
EOF

read -p "enter start, stop, restart, status, quit:" option

start() {
	if [ ! -f $lockfile ];then
		touch $lockfile
		[ $? -eq 0 ] && echo "start $prog finished"
	else
		echo "$prog is running "	
	fi
}

stop() {
	if [ -f $lockfile  ];then
		rm -rf $lockfile
		[ $? -eq 0 ] && echo "stop $prog finished"
	else
		echo "$prog is not running"  
	fi
}

status() {
	if [ -f $lockfile  ];then
		echo "$prog is running"
	else
		echo "prog is not runing"
	fi
}

case $option in
start)
	start
	;;
stop)
	stop
	;;
restart)
	stop
	start
	;;
status)
	status
	 ;;
quit)
	exit 0
	;;
*)	
		
	echo "enter your option again"
	exit 2
	;;
esac

编写脚本/root/bin/copycmd.sh

(1) 提示用户输入一个可执行命令名称;

(2) 获取此命令所依赖到的所有库文件列表

(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;

如:/bin/bash ==> /mnt/sysroot/bin/bash

/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd

(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:

如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2

(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出

#!/bin/bash
#
f_dir=/mnt/sysroot

cmd_input () {
	while true
	do
		read -p "Please input an excuteable command to backup (quit to exit): " cmd
		if [[ -z $cmd ]];then
			echo "wrong option,try again..."
			continue
		elif [[ $cmd == "quit" ]];then
			exit 88
		elif ! which --skip-alias $cmd &>/dev/null;then
			echo "No such command,try again..."
			continue
		else
			break
		fi
	done

}

cp_cmd() {

	cmd_path=`which  --skip-alias $cmd`
	cmd_dir=`dirname $cmd_path`
	[ ! -d $f_dir$cmd_dir ] && mkdir -p $f_dir$cmd_dir 
	cp $cmd_path $f_dir$cmd_dir && echo "backup $cmd finished"

}

cp_cmd_lib() {

	cmd_lib=`ldd $cmd_path`
	for path in $cmd_lib
	do
		cmd_lib_dir=`echo $path | grep -o -E '/[^[:space:]]+.*/'`
		if [[ ! -d $f_dir$cmd_lib_dir ]];then
			mkdir -p $f_dir$cmd_lib_dir && cp $path $f_dir$cmd_lib_dir &> /dev/null
		else
			cp $path $f_dir$cmd_lib_dir &> /dev/null
		fi
	done
	echo "backup ${cmd}'s library finished"

}

main() {

	while true
	do
		cmd_input  
		cp_cmd
		cp_cmd_lib
	done

}

main

select 循环与菜单
select variable in list
do
循环体命令
done

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中。

select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c退出循环。
select 经常和 case 联合使用
与 for 循环类似,可以省略 in list , 此时使用位置参量



原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/38862

(0)
M20-1马星M20-1马星
上一篇 2016-08-24 10:25
下一篇 2016-08-24 10:25

相关推荐

  • 循环的特殊用法及函数

    while特殊用法 while read 变量名;do 循环体 done<文件路径(将文件中的每一行依次读入循环体,赋值给变量)   (())可以实现C语言风格的变量操作 for循环特殊格式 for((控制变量初始化;条件判断表达式;控制变量修正表达式)) do 循环体 done 控制变量初始化仅在循环开始时执行一次,进行条件判断成立后执行循…

    Linux干货 2016-08-21
  • 初学正则表达式

      前言:     在学正则表达式之前,有小伙伴讲解说,正则表达式在文本处理上功能非常强大、使用非常普遍,并且现在很多的工具软件都支持它,以后的学习工作中会经常使用,非常灵活,但是灵活的同时又是繁琐,需要小心翼翼的仔细推敲。抱着认真、好奇的心思听完了王老的课。我自己理解的正则表达式是,给一些符号赋予一定的涵义…

    Linux干货 2016-08-12
  • Linux用户组管理

    马哥网络教育21期+第三周练习 用户及用户组 用户配置文件     用户:UID,/etc/passwd     组:GID,/etc/group 密码配置文件     用户:/etc/shadow    &n…

    Linux干货 2016-09-02
  • M25开篇”如何学习Linux”

    首先有幸参加马哥linux运维工程师培训,在接下来的四个半月里如何学好linux,首先得了解什么是linux? 在开班前对linux的初步了解中知道linux是免费、开源、拥有广泛而开放的linux社区的一款服务器操作系统,比较于windows和linux的用处都各有特点。 windows的用户体验众人皆知,作为一款亲民友善的系统,没有学习成本,甚至学龄前童…

    2017-07-11
  • MAN手册各章节功能介绍及快捷键位详细说明

    MAN手册各章节功能介绍及快捷键位详细说明 M21-陆东贵 Man命令的作用:获取外部命令的使用帮助信息; 使用方法:]#  man  COMMAND        选项:        -M /PATH/TO/SOME…

    Linux干货 2016-10-18
  • bash代码注入的安全漏洞

           很多人或许对上半年发生的安全问题“心脏流血”(Heartbleed Bug)事件记忆颇深,这两天,又出现了另外一个“毁灭级”的漏洞——Bash软件安全漏洞。这个漏洞由法国GNU/Linux爱好者Stéphane Chazelas所发现。随后,美国电脑紧急应变中心(US-CERT)、红帽以及多家从事安全的公…

    Linux干货 2015-03-30