linux指令rvsh,编写服务脚本/root/bin/testsrv.sh和备份脚本/root/bin/copycmd.sh

本文详细介绍了如何编写Linux Shell脚本,包括创建服务脚本`testsrv.sh`,实现启动、停止、重启及状态检查功能,并处理各种边界情况。同时,展示了另一个脚本`copycmd.sh`,该脚本能够复制指定命令及其依赖库到目标目录,用户可连续输入多个命令进行备份,直至输入'quit'退出。这两个脚本充分展示了Shell脚本在系统管理和自动化操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写服务脚本/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 <

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值