vim    /sbin/service

#!/bin/sh

. /etc/init.d/functions #读取环境变量.

VERSION="$(basename $0) ver. 0.91" #"service[获取的第一个参数] ver. 0.91"对应后面的"service -V"
USAGE="Usage: $(basename $0) < option > | --status-all | \
[ service_name [ command | --full-restart ] ]" #打印第一个参数和帮助信息.
SERVICE= #为空
SERVICEDIR="/etc/init.d" #service目录变量赋值
OPTIONS= #为空

if [ $# -eq 0 ]; then #参数数等于0,# service 命令后直接输出$USAGE
echo "${USAGE}" >&2{这个看博客上一篇文章解释}
exit 1 #错误返回码,因为缺少参数所以用这个
fi

cd / #进入"/"目录
while [ $# -gt 0 ]; do #如果参数大于0
case "${1}" in
--help | -h | --h* ) #第一个参数为这3种其一
echo "${USAGE}" >&2 #打印输出$USAGE
exit 0 #正确返回码.
;;
--version | -V ) #第一个参数为这2种其一
echo "${VERSION}" >&2 #输出"service ver. 0.91"即$VERSION变量
exit 0 #返回正确代码.
;;
*)
if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then #$SERVICE为空且只有一个"--status-all"参数
cd ${SERVICEDIR} #进入"/etc/init.d"目录
for SERVICE in * ; do #$SERVICE获得程序脚本.
case "${SERVICE}" in
functions | halt | killall | single| linuxconf| kudzu)
;; #若程序脚本是这些什么都不做
*)
if ! is_ignored_file "${SERVICE}" \
&& [ -x "${SERVICEDIR}/${SERVICE}" ]; then #"-x" FILE exists and execute (or search) permission is granted
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status #-i, --ignore-environment(start with an empty environment)
#env -i PATH="$PATH" TERM="$TERM" /etc/init.d/rsyslog status 等同于 /etc/init.d/rsyslog status
fi
;;
esac
done
exit 0
elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then #$SERVICE参数为2个且第二个参数为"--full-restart"
SERVICE="${1}" #第一个参数为service名称
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then # -x FILE,FILE exists and execute (or search) permission is granted
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop #等同于/etc/init.d/rsyslog stop,这个意思为新启个shell环境(可能,待研究)
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start
exit $? #返回上一个命令的正确或错误代码
fi
elif [ -z "${SERVICE}" ]; then #$SERVICE长度为0,这种考虑在内,一般不会出现.
SERVICE="${1}" #$SERVICE变量为第一个参数,获取service后的第一个参数
else
OPTIONS="${OPTIONS} ${1}" #$OPTIONS(为空)+第一个参数,即获取第一个参数.
fi
shift #shift命令每执行一次,变量的个数($#)减一,而变量值提前一位
;;
esac
done

if [ -f "${SERVICEDIR}/${SERVICE}" ]; then #$SERVICE是个二进制文件
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS} #执行$OPTIONS选项
else
echo $"${SERVICE}: unrecognized service" >&2 #否则打印左移的第一个参数为不可识别服务,./service yy==>yy: unrecognized service
exit 1 #返回错误代码
fi

==========================================================================================================

Shell重定向&>file、2>&1、1>&2的区别 (2014-07-11 16:49:24)
shell上:
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中

用例子说话:

1. grep da * 1>&2
2. rm -f $(find / -name core) &> /dev/null
上面两例中的 & 如何理解,&不是放到后台执行吗?

牛解:

1.&>file或n>&m均是一个独立的重定向符号,不要分开来理解。

2.明确文件和文件描述符的区别。

3.&>file表示重定向标准输出和错误到文件
例如:
rm -f $(find / -name core) &> /dev/null,/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。

4.n>&m表示使文件描述符n成为输出文件描述符m的副本。这样做的好处是,有的时候你查找文件的时候很容易产生无用的信息,如:2> /dev/null的作用就是不显示标准错误输出;另外当你运行某些命令的时候,出错信息也许很重要,便于你检查是哪出了毛病,如:2>&1
例如:
注意,为了方便理解,必须设置一个环境使得执行grep da *命令会有正常输出和错误输出,然后分别使用下面的命令生成三个文件:
grep da * > greplog1
grep da * > greplog2 1>&2
$$$$$ grep da * > greplog3 2>&1 //grep da * 2> greplog4 1>&2 结果一样 $$$$$
#查看greplog1会发现里面只有正常输出内容
#查看greplog2会发现里面什么都没有
#查看greplog3会发现里面既有正常输出内容又有错误输出内容

每天一个脚本解析day1==》《service xxxxx status》之service脚本解析相关推荐

  1. 查看防火墙状态service iptables status报错

    查看防火墙状态service iptables status iptables.service找不到! 安装源 yum install iptables-services 再次查看防火墙状态

  2. 用python爬小说_今天分享一个用Python来爬取小说的小脚本!(附源码)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章天气预报数据分析与统计之美 ,作者:❦大头雪糕❦ Python GUI制作小说下载器教学讲 ...

  3. fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本

    一直觉得大部分的FC/NES模拟器的作弊码金手指不是那么方便使用, 比如魂斗罗1代, 玩家的武器可以通过修改0xAA的值来改变: 0x11为M弹(重机枪),0x12为F弹(圈圈),0x13为S弹(散弹 ...

  4. systemctl status mysqld.service或者systemctl start mysqld 启动失败的解决办法

    报错过程: mysql需要启动,执行一下命令启动mysql: systemctl start mysqld.service 结果出现如下提示 Job for mysqld.service failed ...

  5. Oracle Net Service:监听器与服务名解析方法

    Oracle Net Service:监听器与服务名解析方法 什么是Oracle Net服务 Oracle Net服务配置 Oracle Net监听器 静态注册 动态注册 Oracle Net服务名解 ...

  6. Android启动过程中执行一个C语言的应用程序或者执行shell脚本

    Android启动过程中执行一个C语言的应用程序或者执行shell脚本 一.Android启动过程中去对系统做一些设置,如修改某些文件夹的属性和文件的权限,可在init.rc中增加service执行s ...

  7. python爬取天气预报数据并保存为txt格式_今天分享一个用Python来爬取小说的小脚本!(附源码)...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章天气预报数据分析与统计之美 ,作者:❦大头雪糕❦ Python GUI制作小说下载器教学讲 ...

  8. service iptables status无法执行,报错

    1. service iptables status 结果为edirecting to /bin/systemctl stop iptables.service Failed to stop ipta ...

  9. nginx启动报错:Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' fo

    一.背景 这个错误在重启nginx或者启动nginx的时候,经常会出现.我之前也一直认为出现这个错误是因为有程序占用了nginx的进程.但是知其然不知其所以然.每次报错都有点懵逼,所以这边一步步排查错 ...

最新文章

  1. SVN 两种存储格式(BDB和FSFS)区别
  2. Xargs用法详解(原创)
  3. linux history 看更多历史记录_Linux历史记录history常用技巧
  4. hdu 2896 病毒侵袭
  5. ASP.NET Core 配置源:实时生效
  6. 机器人无限火力无限e符文_LOL:无限火力开黑指南 三大玩法让你快乐加倍
  7. 2017年SEO行业的前景以及未来趋势
  8. Spring boot (1)--- 第一个应用程序helloworld
  9. lan交换和无线教师手册_无线交换机的出现,能否解放双手?
  10. 小米mix2s html,【小米MIX2s评测】2018需要加价买的旗舰 小米MIX 2S评测_小米 MIX 2s(6GB RAM/全网通)_手机评测-中关村在线...
  11. 最简单的基于FFmpeg的移动端例子:IOS HelloWorld
  12. 如何精确计算 LoRaWAN 终端电池寿命
  13. 《鱿鱼游戏》播完,椪糖生意火了
  14. 前端实现高效的海报系统
  15. Fiddler4下载安装和火狐搭配使用
  16. 把路由器变成音乐播放器和网络收音机,支持摇控
  17. Windows 7 新功能选集
  18. docx行间距怎么设置_Word行间距怎么调?Word调行间距的方法
  19. 数风流人物还看今朝|前后端分离微服务项目常用中间件以及指令
  20. 数据分析在一个企业中起到哪些关键性作用?

热门文章

  1. 淘宝Web服务器Tengine正式开源
  2. Hadoop单词统计
  3. SQL 修改主键约束
  4. HTML 5.2 有哪些新内容?
  5. redux源码分析之二:combineReducers.js
  6. PCB 多层设计 实例视频教程 pretell99
  7. 【廖雪峰官方网站/Java教程】Maven基础
  8. Leetcode 254.因子的组合
  9. Leetcode 278.第一个错误的版本
  10. Leetcode 303.区域和检索 - 数组不可变