【问题标题】:init program in shell script在 shell 脚本中初始化程序
【发布时间】:2015-10-16 03:02:44
【问题描述】:

我一直试图理解这段代码,但我无法理解它的全部内容。我知道“init”是第一个启动过程,并且该程序用于启动或结束特定提及的服务。但是'kill'中的'cat'是做什么的呢?这个程序在启动、停止和重启时系统内部会发生什么?

#!/bin/sh
test -f /usr/sbin/sshd || exit 0
case "$1" in
start)
echo -n "Starting sshd: sshd"
/usr/sbin/sshd
echo "."
;;
stop)
echo -n "Stopping sshd: sshd"
kill `cat /var/run/sshd.pid`
echo "."
;;
restart)
echo -n "Stopping sshd: sshd"
kill `cat /var/run/sshd.pid`
echo "."
echo -n "Starting sshd: sshd"
/usr/sbin/sshd
echo "."
;;
*)
echo "Usage: /etc/init.d/sshd start|stop|restart"
exit 1
;;
esac

【问题讨论】:

  • 我想你已经混淆了init 进程和init.d 启动服务的脚本。
  • 我可能有。你能解释一下代码吗?
  • 这只是一个普通的shell脚本。您只需要阅读它就可以了解它的作用。如果您不知道catkill 是什么,那么我建议您查看它们的手册页。该初始化脚本(位于 init.d 中的服务启动脚本称为“初始化脚本”,这可能会让您感到困惑)是 sshd 服务/守护进程的脚本。 init 进程/程序也有一个手册页。
  • 欢迎来到 SO。 SO不是提出“请解释代码”类型问题的最佳场所。当您遇到特定错误或问题时,它最有效。您要问的内容与基本的 *nix 命令有关。我建议类似(基本的 unix 命令)[thegeekstuff.com/2010/11/50-linux-commands/] 或 google unix command line getting started
  • 但是当程序运行时系统会发生什么?

标签: shell init


【解决方案1】:

当一个 Unix 操作系统启动时,它将运行 /etc/init.d 中的所有脚本,其中包括这个,带有“start”参数。然后,该脚本调用 /usr/sbin/sshd 分叉一个后台进程并终止。后台进程将再次分叉,其子进程将成为恶魔进程。恶魔进程将其 PID 写入 /var/run/sshd.pid 并开始服务。关闭操作系统后,将再次使用“stop”参数调用此脚本。它会从文件中收集恶魔的 PID 并优雅地终止它(没有 switch kill 发送 SIGTERM 就像 'kill -15 $pid' 一样)。

【讨论】:

  • it will run all the scripts in /etc/init.d -- 这并不完全正确。 /etc/init.d 中有许多脚本仅根据 runlevel(现在为 systemd target)运行。在旧的 init 脚本启动下运行的是由/etc/init.d/rcS.d/ 中的软链接,然后是任何给定运行级别[0-6]/etc/init.d/rc[0-6].d//etc/init.d/ 中还有其他脚本用于已安装但未配置为在启动时运行的软件包。