问题通用场景描述:测试服务器上的服务众多,为了避免过大的资源开销将原先的服务都设置为开机不启动,仅保留一些必要的系统服务,因此当需要使用哪些服务时需要手动开启。有的服务对其他服务可能存在依赖关系,例如服务A依赖服务B,服务B依赖服务C。此时可以用顺序执行的方式解决依赖问题,如果检查到依赖不满足,则退出执行。
编码思路:
(一)为什么使用函数?
1.当有重复代码或 当一个任务只需要很少的修改就被重复几次执行时, 这时你应考虑使用函数.
2.函数可以处理传递给它的参数并且能返回它的退出状态码(exit status)给脚本后续使用.
(二)函数参数如何传递的?
函数以位置来引用传递过来的参数(就好像他们是位置参数(positional parameters)), 例如$1,$2以此类推.
(三)如何处理依赖关系?
用顺序执行的方式解决依赖问题,如果检查到依赖不满足,则退出执行。
编码范例:
#!/bin/bash REQUIRED_SERVICE_1=mysql REQUIRED_SERVICE_2=zabbix-server REQUIRED_SERVICE_3=zabbix-agent function help(){ echo "Function: start\stop zabbix service and dependence, and check status" echo "Usage: $0 {start|stop|status|help}" } function check_service_if_is_running(){ SERVICE=$1 service $SERVICE status >/dev/null 2>&1 REVAL=$? if [[ $REVAL -eq 0 ]]; then return 0 else return 1 fi } function start_service_if_is_stoped(){ SERVICE=$1 service $SERVICE start >/dev/null 2>&1 check_service_if_is_running $SERVICE REVAL=$? if [[ $REVAL -eq 0 ]]; then echo $SERVICE is running... else echo $SERVICE is not running, error code is $REVAL. exit 1 fi } function stop_service_if_is_running(){ SERVICE=$1 service $SERVICE stop >/dev/null 2>&1 check_service_if_is_running $SERVICE REVAL=$? if [[ $REVAL -eq 1 ]]; then echo $SERVICE is stoped... fi } function status_service(){ SERVICE=$1 check_service_if_is_running $SERVICE REVAL=$? if [[ $REVAL -eq 0 ]]; then echo $SERVICE is running... else echo $SERVICE is not running, error code is $REVAL. exit 1 fi } function start(){ start_service_if_is_stoped $REQUIRED_SERVICE_1 start_service_if_is_stoped $REQUIRED_SERVICE_2 start_service_if_is_stoped $REQUIRED_SERVICE_3 } function stop(){ stop_service_if_is_running $REQUIRED_SERVICE_3 stop_service_if_is_running $REQUIRED_SERVICE_2 stop_service_if_is_running $REQUIRED_SERVICE_1 } function status(){ status_service $REQUIRED_SERVICE_1 status_service $REQUIRED_SERVICE_2 status_service $REQUIRED_SERVICE_3 } case "$1" in start) start ;; stop) stop ;; status) status ;; *) help exit 1 ;; esac
编码测试:
--END--
时间: 2024-10-01 06:19:29