一文看懂嵌入式/etc/init.d/目录下的所有启动文件

本目录下的所有文件

[root@EPC-M6G2C init.d]# ls
S01logging*          S30dbus*             S50telnet*           S90start_userapp.sh* 
S10udev*             S40network*          S70vsftpd*           socketcand*
S13portmap*          S50dropbear*         S80mount-opt*        rcK*
S20urandom*          S50sshd*             S81web.sh*           rcS*

   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

先看一下rcS文件,它是本目录在开机时最先启动的文件

file:rcS

#!/bin/sh

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f KaTeX parse error: Expected 'EOF', got '&' at position 88: …oken operator">&̲amp;&amp;</span…i in
*.sh) #.sh结尾的脚本
# Source shell script for speed.
(
trap - INT QUIT TSTP #重置陷阱为启动shell时的陷阱
set start #设置传入的参数
. KaTeX parse error: Expected 'EOF', got '#' at position 38: …token comment">#̲执行,携带start参数</s…i start #执行,携带start参数
;;
esac
done

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

总结:检测大写S开头的所有脚本并执行它们。
trap 命令

rcK文件是设备关机或重启执行的文件,它和rcS差不多,只有传入的参数有微微差别

file:rcK

#!/bin/sh

# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in KaTeX parse error: Expected 'EOF', got '#' at position 218: …token comment">#̲()相当于反引号,首先执行命令,-r倒序排列
# Ignore dangling symlinks (if any).
[ ! -f KaTeX parse error: Expected 'EOF', got '&' at position 88: …oken operator">&̲amp;&amp;</span…i in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set stop
. KaTeX parse error: Expected 'EOF', got '#' at position 38: …token comment">#̲执行,携带stop参数</sp…i stop #执行,携带stop参数
;;
esac
done

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

总结:关机时还需要启动一遍启动脚本,只不过传入的参数是stop,需要处理一些后续工作才关机。

file:S01logging

#!/bin/sh
#
# Start logging
#

start() {
echo -n "Starting logging: "
start-stop-daemon -b -S -q -m -p /var/run/syslogd.pid --exec /sbin/syslogd – -n
start-stop-daemon -b -S -q -m -p /var/run/klogd.pid --exec /sbin/klogd – -n
echo “OK”
}

stop() {
echo -n "Stopping logging: "
start-stop-daemon -K -q -p /var/run/syslogd.pid
start-stop-daemon -K -q -p /var/run/klogd.pid
echo “OK”
}

case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $? #最后一次命令的执行状态码,0为正常。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

由rcS或者rcK脚本调用的子进程运行此脚本,传递start或stop参数来控制执行start函数或stop函数。
start-stop-daemon守护进程启停工具命令
参数
-b | --background 后台运行
-S | --start – <argument> 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-q | --quiet 不要输出警告
-m| --make-pidfile 当命令本身不创建pidfile时,由start-stop-daemon创建
-p | --pidfile <pid-file> 要检查的pid文件
-x | --exec <executable> 程序启动/检查它是否正在运行
-n | --name <process-name> 要检查的进程名称

file:S10udev

#!/bin/sh
#
# udev  This is a minimal non-LSB version of a UDEV startup script.  It
#       was derived by stripping down the udev-058 LSB version for use
#       with buildroot on embedded hardware using Linux 2.6.34+ kernels.
#
#       You may need to customize this for your system's resource limits
#       (including startup time!) and administration.  For example, if
#       your early userspace has a custom initramfs or initrd you might
#       need /dev much earlier; or without hotpluggable busses (like USB,
#       PCMCIA, MMC/SD, and so on) your /dev might be static after boot.
#
#       This script assumes your system boots right into the eventual root
#       filesystem, and that init runs this udev script before any programs
#       needing more device nodes than the bare-bones set -- /dev/console,
#       /dev/zero, /dev/null -- that's needed to boot and run this script.
#

# Check for missing binaries
UDEV_BIN=/sbin/udevd
test -x $UDEV_BIN || exit 5 #文件不可执行则退出,退出码:5

# Check for config file and read it
UDEV_CONFIG=/etc/udev/udev.conf
test -r KaTeX parse error: Expected 'EOF', got '#' at position 129: …token comment">#̲文件不可读则退出,退出码:6<…UDEV_CONFIG

case "KaTeX parse error: Expected 'EOF', got '#' at position 134: …token comment">#̲设备开机时</span> …{udev_root:-/dev} using udev: "
printf ‘\000\000\000\000’ > /proc/sys/kernel/hotplug
$UDEV_BIN -d || (echo “FAIL” && exit 1) #执行失败打印“FAIL”并退出
udevadm trigger --type=subsystems --action=add
udevadm trigger --type=devices --action=add
udevadm settle --timeout=30 || echo “udevadm settle failed”
echo “done”
;;
stop) #设备关机或重启
# Stop execution of events
udevadm control --stop-exec-queue
killall udevd
;;
*)
echo “Usage: $0 {start|stop}”
exit 1
;;
esac

exit 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

udevadm命令详解
udevadm trigger [options]  接收内核发送来的设备事件。主要用于重放coldplug事件信息
–type=type         触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices
–action=action      被触发的事件,默认是change

udevadm settle [options]  查看udev事件队列,如果所有事件全部处理完就退出。
–timeout=seconds     等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。

udevadm control [options]   控制udev守护进程(systemd-udevd)的内部状态。
-s, --stop-exec-queue    向 systemd-udevd 发送"禁止处理事件"信号, 这样所有新发生的事件都将进入等候队列。

file:S13portmap

#! /bin/sh

[ -f /sbin/portmap ] || exit 0 #不存在此文件就退出

start() {
echo -n "Starting portmap: "
portmap
mkdir -p /var/lock/subsys
touch /var/lock/subsys/portmap #锁定此服务
echo “done”
}

stop() {
echo -n "Stopping portmap: "
echo
killall portmap
rm -rf /var/lock/subsys
echo “done”
}

restart() {
stop
start
rm -f /var/run/portmap.state
}

# See how we were called.
case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo “Usage: $0 {start|stop|reload|restart}”
exit 1
esac

exit $?

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

参考:portmap的作用

file:S20urandom

#! /bin/sh
#
# urandom       This script saves the random seed between reboots.
#               It is called from the boot, halt and reboot scripts.
#
# Version:      @(#)urandom  1.33  22-Jun-1998  miquels@cistron.nl
#

[ -c /dev/urandom ] || exit 0 #不存在字符设备urandom就退出
#. /etc/default/rcS

case KaTeX parse error: Expected 'EOF', got '#' at position 227: …token comment">#̲ check for read…VERBOSE != no ]
then
echo -n “Initializing random number generator… “
fi
# Load and then save 512 bytes,
# which is the size of the entropy pool
cat /etc/random-seed >/dev/urandom
rm -f /etc/random-seed
umask 077 #配置文件夹默认权限
dd if=/dev/urandom of=/etc/random-seed count=1
>/dev/null 2>&1 || echo “urandom start: failed.”
umask 022
[ KaTeX parse error: Expected 'EOF', got '&' at position 136: …oken operator">&̲amp;&amp;</span…VERBOSE != no ] && echo -n “Saving random seed… “
umask 077
dd if=/dev/urandom of=/etc/random-seed count=1
>/dev/null 2>&1 || echo “urandom stop: failed.”
[ $VERBOSE != no ] && echo “done.”
;;
*)
echo “Usage: urandom {start|stop}” >&2
exit 1
;;
esac

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

dd命令详解

file:S30dbus

#!/bin/sh
#
# messagebus:   The D-BUS systemwide message bus
#
# chkconfig: 345 97 03
# description:  This is a daemon which broadcasts notifications of system events \
#               and other messages. See http://www.freedesktop.org/software/dbus/
#
# processname: dbus-daemon
# pidfile: /var/run/messagebus.pid
#

# Sanity checks.
[ -x /usr/bin/dbus-daemon ] || exit 0 #非可执行文件则退出

# Create needed directories.
[ -d /var/run/dbus ] || mkdir -p /var/run/dbus #无此目录则创建, -p 循环创建,多层目录结构
[ -d /var/lock/subsys ] || mkdir -p /var/lock/subsys
[ -d /tmp/dbus ] || mkdir -p /tmp/dbus

RETVAL=0

start() {
echo -n "Starting system message bus: "

dbus-uuidgen --ensure
dbus-daemon --system
RETVAL<span class="token operator">=</span><span class="token variable">$?</span>
<span class="token keyword">echo</span> <span class="token string">"done"</span>
<span class="token punctuation">[</span> <span class="token variable">$RETVAL</span> -eq 0 <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> /var/lock/subsys/dbus-daemon <span class="token comment">#dbus-daemon命令执行正常,锁定</span>

}

stop() {
echo -n "Stopping system message bus: "

<span class="token comment">## we don't want to kill all the per-user $processname, we want</span>
<span class="token comment">## to use the pid file *only*; because we use the fake nonexistent </span>
<span class="token comment">## program name "$servicename" that should be safe-ish</span>
<span class="token function">killall</span> dbus-daemon
RETVAL<span class="token operator">=</span><span class="token variable">$?</span>
<span class="token keyword">echo</span> <span class="token string">"done"</span>
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$RETVAL</span> -eq 0 <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
    <span class="token function">rm</span> -f /var/lock/subsys/dbus-daemon
    <span class="token function">rm</span> -f /var/run/messagebus.pid
<span class="token keyword">fi</span>

}

# See how we were called.
case " 1 < / s p a n > " < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > i n < / s p a n > s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > s t o p < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > s t o p < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > s t a t u s < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > s t a t u s < s p a n c l a s s = " t o k e n v a r i a b l e " > 1</span>"</span> <span class="token keyword">in</span> start<span class="token punctuation">)</span> start <span class="token punctuation">;</span><span class="token punctuation">;</span> stop<span class="token punctuation">)</span> stop <span class="token punctuation">;</span><span class="token punctuation">;</span> status<span class="token punctuation">)</span> status <span class="token variable"> 1</span>"</span><spanclass="tokenkeyword">in</span>start<spanclass="tokenpunctuation">)</span>start<spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>stop<spanclass="tokenpunctuation">)</span>stop<spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>status<spanclass="tokenpunctuation">)</span>status<spanclass="tokenvariable">processname
RETVAL= ? < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > r e s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > s t o p s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > c o n d r e s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > i f < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > [ < / s p a n > − f / v a r / l o c k / s u b s y s / < s p a n c l a s s = " t o k e n v a r i a b l e " > ?</span> <span class="token punctuation">;</span><span class="token punctuation">;</span> restart<span class="token punctuation">)</span> stop start <span class="token punctuation">;</span><span class="token punctuation">;</span> condrestart<span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> -f /var/lock/subsys/<span class="token variable"> ?</span><spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>restart<spanclass="tokenpunctuation">)</span>stopstart<spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>condrestart<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">if</span><spanclass="tokenpunctuation">[</span>f/var/lock/subsys/<spanclass="tokenvariable">servicename ]; then
stop
start
fi
;;
reload)
echo “Message bus can’t reload its configuration, you have to restart it”
RETVAL=$?
;;
*)
echo "Usage: 0 < / s p a n > s t a r t ∣ s t o p ∣ s t a t u s ∣ r e s t a r t ∣ c o n d r e s t a r t ∣ r e l o a d " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > e s a c < s p a n c l a s s = " t o k e n k e y w o r d " > e x i t < / s p a n > < s p a n c l a s s = " t o k e n v a r i a b l e " > 0</span> {start|stop|status|restart|condrestart|reload}"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span> esac <span class="token keyword">exit</span> <span class="token variable"> 0</span>startstopstatusrestartcondrestartreload"</span><spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>esac<spanclass="tokenkeyword">exit</span><spanclass="tokenvariable">RETVAL

dbus-uuidgen 命令生成或读取一个全局唯一ID
–ensure[=FILENAME]
如果未提供文件名,则默认为 localstatedir / lib / dbus / machine-id(localstatedir通常为/ var)。如果该文件存在,则将对其进行验证,如果包含错误的内容,则返回失败代码。如果该文件不存在,则将使用新的uuid创建该文件。成功时,不输出任何输出。

dbus-daemon — Message bus daemon 消息总线守护进程
–system 使用系统范围消息总线的标准配置文件。

file:S40network

#!/bin/sh
#
# Start the network....
#

# Debian ifupdown needs the /run/network lock directory
mkdir -p /run/network

case $1 in
start)
echo “Starting network…”
/sbin/ifup -a
;;
stop)
echo -n “Stopping network…”
/sbin/ifdown -a
;;
restart|reload)
$0 stop
$0 start
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $?

ifup eth0 #激活eth0
ifdown eth0 #禁用eth0
-a 自动配置(禁用)所有接口

file:S50dropbear

#!/bin/sh
#
# Starts dropbear sshd.
#

# Allow a few customizations from a config file
test -r /etc/default/dropbear && . /etc/default/dropbear #为可读文件则执行

start() {
DROPBEAR_ARGS=$DROPBEAR_ARGS -R”

    <span class="token comment"># If /etc/dropbear is a symlink to /var/run/dropbear, and</span>
    <span class="token comment">#   - the filesystem is RO (i.e. we can not rm the symlink),</span>
    <span class="token comment">#     create the directory pointed to by the symlink.</span>
    <span class="token comment">#   - the filesystem is RW (i.e. we can rm the symlink),</span>
    <span class="token comment">#     replace the symlink with an actual directory</span>
    <span class="token keyword">if</span> <span class="token punctuation">[</span> -L /etc/dropbear \ <span class="token comment">#是一个符号链接</span>
         -a <span class="token string">"<span class="token variable"><span class="token variable">$(</span>readlink /etc/dropbear<span class="token variable">)</span></span>"</span> <span class="token operator">=</span> <span class="token string">"/var/run/dropbear"</span> <span class="token punctuation">]</span> <span class="token comment">#文件存在</span>
    <span class="token keyword">then</span>
            <span class="token keyword">if</span> <span class="token function">rm</span> -f /etc/dropbear <span class="token operator">&gt;</span>/dev/null 2<span class="token operator">&gt;</span><span class="token operator">&amp;</span>1<span class="token punctuation">;</span> <span class="token keyword">then</span> <span class="token comment">#错误输出重定向到标准输出,标准输出重定向到空文件(不打印任何东西)</span>
                    <span class="token function">mkdir</span> -p /etc/dropbear <span class="token comment">#成功删除则创建此目录</span>
            <span class="token keyword">else</span>
                    <span class="token keyword">echo</span> <span class="token string">"No persistent location to store SSH host keys. New keys will be"</span>
                    <span class="token keyword">echo</span> <span class="token string">"generated at each boot. Are you sure this is what you want to do?"</span>
                    <span class="token function">mkdir</span> -p <span class="token string">"<span class="token variable"><span class="token variable">$(</span>readlink /etc/dropbear<span class="token variable">)</span></span>"</span>
            <span class="token keyword">fi</span>
    <span class="token keyword">fi</span>

    <span class="token keyword">echo</span> -n <span class="token string">"Starting dropbear sshd: "</span>
    <span class="token function">umask</span> 077

    start-stop-daemon -S -q -p /var/run/dropbear.pid \
            --exec /usr/sbin/dropbear -- <span class="token variable">$DROPBEAR_ARGS</span>
    <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token operator">=</span> 0 <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token keyword">echo</span> <span class="token string">"OK"</span> <span class="token operator">||</span> <span class="token keyword">echo</span> <span class="token string">"FAIL"</span>

}
stop() {
echo -n "Stopping dropbear sshd: "
start-stop-daemon -K -q -p /var/run/dropbear.pid
[ $? = 0 ] && echo “OK” || echo “FAIL”
}
restart() {
stop
start
}

case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $?

start-stop-daemon守护进程启停工具命令
参数
-S | --start – <argument> 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-q | --quiet 不要输出警告
-p | --pidfile <pid-file> 要检查的pid文件
-x | --exec <executable> 程序启动/检查它是否正在运行

file:S50sshd

#!/bin/sh
#
# sshd        Starts sshd.
#

# Make sure the ssh-keygen progam exists
[ -f /usr/bin/ssh-keygen ] || exit 0

# Create any missing keys
/usr/bin/ssh-keygen -A

umask 077

start() {
echo -n "Starting sshd: "
/usr/sbin/sshd
wr touch /var/lock/sshd
echo “OK”
}
stop() {
echo -n "Stopping sshd: "
wr killall sshd
wr rm -f /var/lock/sshd
echo “OK”
}
restart() {
stop
start
}

case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $?

ssh-keygen -A
对于主机密钥不存在的每个密钥类型(rsa1、rsa、dsa、ecdsa和ed25519),生成带有默认密钥文件路径、空口令、密钥类型的默认位和默认注释的主机密钥。系统管理脚本使用它来生成新的主机密钥。因此,如果您的系统还没有主机密钥,ssh-keygen -A将创建它们。
参考:ssh-keygen 中文手册

file:S50telnet

#!/bin/sh
#
# Start telnet....
#

start() {
echo -n "Starting telnetd: "
start-stop-daemon -S -q -m -b -p /var/run/telnetd.pid
-x /usr/sbin/telnetd – -F
[ $? = 0 ] && echo “OK” || echo “FAIL”
}

stop() {
echo -n "Stopping telnetd: "
start-stop-daemon -K -q -p /var/run/telnetd.pid
-x /usr/sbin/telnetd
[ $? = 0 ] && echo “OK” || echo “FAIL”
}

case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $?

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

start-stop-daemon守护进程启停工具命令
参数
-S | --start – <argument> 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-q | --quiet 不要输出警告
-m| --make-pidfile 当命令本身不创建pidfile时,由start-stop-daemon创建
-b | --background 后台运行
-p | --pidfile <pid-file> 要检查的pid文件
-x | --exec <executable> 程序启动/检查它是否正在运行

file:S70vsftpd

#! /bin/sh

set -e

DESC=“vsftpd”
NAME=vsftpd
DAEMON=/usr/sbin/$NAME

case " 1 < / s p a n > " < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > i n < / s p a n > s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > − n < s p a n c l a s s = " t o k e n s t r i n g " > " S t a r t i n g < s p a n c l a s s = " t o k e n v a r i a b l e " > 1</span>"</span> <span class="token keyword">in</span> start<span class="token punctuation">)</span> <span class="token keyword">echo</span> -n <span class="token string">"Starting <span class="token variable"> 1</span>"</span><spanclass="tokenkeyword">in</span>start<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">echo</span>n<spanclass="tokenstring">"Starting<spanclass="tokenvariable">DESC: "
start-stop-daemon -S -b -x N A M E < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " O K " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > s t o p < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > − n < s p a n c l a s s = " t o k e n s t r i n g " > " S t o p p i n g < s p a n c l a s s = " t o k e n v a r i a b l e " > NAME</span> <span class="token keyword">echo</span> <span class="token string">"OK"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span> stop<span class="token punctuation">)</span> <span class="token keyword">echo</span> -n <span class="token string">"Stopping <span class="token variable"> NAME</span><spanclass="tokenkeyword">echo</span><spanclass="tokenstring">"OK"</span><spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>stop<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">echo</span>n<spanclass="tokenstring">"Stopping<spanclass="tokenvariable">DESC: “
start-stop-daemon -K -x N A M E < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " O K " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > r e s t a r t < s p a n c l a s s = " t o k e n o p e r a t o r " > ∣ < / s p a n > f o r c e − r e l o a d < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " R e s t a r t i n g < s p a n c l a s s = " t o k e n v a r i a b l e " > NAME</span> <span class="token keyword">echo</span> <span class="token string">"OK"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span> restart<span class="token operator">|</span>force-reload<span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string">"Restarting <span class="token variable"> NAME</span><spanclass="tokenkeyword">echo</span><spanclass="tokenstring">"OK"</span><spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>restart<spanclass="tokenoperator"></span>forcereload<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">echo</span><spanclass="tokenstring">"Restarting<spanclass="tokenvariable">DESC: “
$0 stop
sleep 1
$0 start
echo ””
;;
*)
echo “Usage: $0 {start|stop|restart|force-reload}” >&2
exit 1
;;
esac

exit 0

start-stop-daemon守护进程启停工具命令
参数
-S | --start – <argument> 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-b | --background 后台运行
-x | --exec <executable> 程序启动/检查它是否正在运行

file:S80mount-opt

#!/bin/sh
#
# mount /dev/mtdblock6 of nandflash in /opt directory
# 

start() {
echo -n "Start mount /opt: "
ubiattach /dev/ubi_ctrl -m 6 -d 1 &&
mount -t ubifs ubi1_0 /opt #ubifs文件系统ubi1_0挂载到/opt目录下

 <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token operator">==</span> 0 <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span> <span class="token comment">#上一条命令:挂载成功返回0</span>
     <span class="token keyword">echo</span> <span class="token string">"Mount /opt ok"</span>
 <span class="token keyword">else</span>
     <span class="token keyword">echo</span> <span class="token string">"flash_erase /dev/mtd6"</span> 
     ubidetach -p /dev/mtd6 
     flash_erase /dev/mtd6 0 0
     ubiformat /dev/mtd6
     ubiattach /dev/ubi_ctrl -m 6 -d 1 
     ubimkvol /dev/ubi1 -N opt -m
     <span class="token function">mount</span> -t ubifs ubi1_0 /opt
 <span class="token keyword">fi</span>    

}
stop() {
echo -n "Unmount /opt: "
umount /opt
ubidetach -p /dev/mtd6
echo “Unmount /opt OK”
}
restart() {
stop
start
}

case $1 in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

exit $?

ubi命令用法
ubiattach
-m, --mtdn=<number>此选项是必须的
MTD device number to attach (alternative method, e.g if the character device node does not exist) 。
附加的MTD设备编号(替代方法,e.g 如果字符设备节点不存在)
注意:是从0开始的。
-d, --devn=<number>
the number to assign to the newly created UBI device (assigned automatically if this is not specified)
分配给新创建的UBI设备的号码(如果没有指定,则自动分配)

ubidetach
-p, --dev-path=<path>
要附加的MTD设备节点的路径。

ubiformat
格式化MTD设备,擦除Flash,保存擦除计数,写入UBI镜像到Flash。
flash_erase命令有类似的效果。

ubimkvol
从UBI设备上创建UBI卷。
-N, --name=<name>
卷名 。
-m, --maxavsize
将卷大小设置为最大可用大小。

file:S81web.sh

#!/bin/sh

/usr/local/webs/bin/webs &

file:S90start_userapp.sh

#!/bin/sh

# set ip
ifconfig eth0 192.168.1.131 #配置eth0接口网络
ifconfig eth1 192.168.2.136

# disable rtc clk_out pins default
echo 0 > /sys/class/rtc/rtc0/device/clk_out_ctl #禁用RTC clk_out引脚

# if test function in sd card then exec
if [ -f “/media/mmcblk0p1/function/functiontest.sh” ]; then #内存卡自定义程序
echo “Start functiontest.sh”
cd /media/mmcblk0p1/function
./functiontest.sh &
fi

# you can add your app start_command here

file:socketcand

#! /bin/sh

### BEGIN INIT INFO
# Provides: socketcand
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: socketcand
# Description: daemon that provides network access to local CAN busses
### END INIT INFO

[ -f /etc/default/rcS ] && . /etc/default/rcS #一般文件(非目录或设备文件)
PATH=/bin:/usr/bin:/sbin:/usr/sbin
prefix=/usr
exec_prefix=/usr
DAEMON=${exec_prefix}/bin/socketcand
DESC=“SocketCAN daemon”
NAME=“socketcand”
PIDFILE=/var/run/socketcand.pid

test -x $DAEMON || exit 0 #/usr/bin/socketcand文件非可执行文件则退出

case 1 < / s p a n > " < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > i n < / s p a n > s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " S t a r t i n g < s p a n c l a s s = " t o k e n v a r i a b l e " > 1</span>"</span> <span class="token keyword">in</span> start<span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string">"Starting <span class="token variable"> 1</span>"</span><spanclass="tokenkeyword">in</span>start<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">echo</span><spanclass="tokenstring">"Starting<spanclass="tokenvariable">DESC N A M E < / s p a n > " < / s p a n > s t a r t − s t o p − d a e m o n − − s t a r t − − q u i e t − − b a c k g r o u n d − − p i d f i l e < s p a n c l a s s = " t o k e n v a r i a b l e " > NAME</span>"</span> start-stop-daemon --start --quiet --background --pidfile <span class="token variable"> NAME</span>"</span>startstopdaemonstartquietbackgroundpidfile<spanclass="tokenvariable">PIDFILE --startas D A E M O N < / s p a n > − m − − − − d a e m o n < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > s t o p < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e c h o < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " S t o p p i n g < s p a n c l a s s = " t o k e n v a r i a b l e " > DAEMON</span> -m -- --daemon <span class="token punctuation">;</span><span class="token punctuation">;</span> stop<span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string">"Stopping <span class="token variable"> DAEMON</span>mdaemon<spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>stop<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">echo</span><spanclass="tokenstring">"Stopping<spanclass="tokenvariable">DESC " N A M E < / s p a n > " < / s p a n > s t a r t − s t o p − d a e m o n − − s t o p − − q u i e t − − p i d f i l e < s p a n c l a s s = " t o k e n v a r i a b l e " > NAME</span>"</span> start-stop-daemon --stop --quiet --pidfile <span class="token variable"> NAME</span>"</span>startstopdaemonstopquietpidfile<spanclass="tokenvariable">PIDFILE --oknodo --startas D A E M O N < / s p a n > < s p a n c l a s s = " t o k e n f u n c t i o n " > r m < / s p a n > − f < s p a n c l a s s = " t o k e n v a r i a b l e " > DAEMON</span> <span class="token function">rm</span> -f <span class="token variable"> DAEMON</span><spanclass="tokenfunction">rm</span>f<spanclass="tokenvariable">PIDFILE
;;
restart)
$0 stop
sleep 1
0 < / s p a n > s t a r t < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > f o r c e − r e l o a d < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ) < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > i f < / s p a n > s t a r t − s t o p − d a e m o n − − s t o p − − t e s t − − q u i e t − − p i d f i l e < s p a n c l a s s = " t o k e n v a r i a b l e " > 0</span> start <span class="token punctuation">;</span><span class="token punctuation">;</span> force-reload<span class="token punctuation">)</span> <span class="token keyword">if</span> start-stop-daemon --stop --test --quiet --pidfile <span class="token variable"> 0</span>start<spanclass="tokenpunctuation">;</span><spanclass="tokenpunctuation">;</span>forcereload<spanclass="tokenpunctuation">)</span><spanclass="tokenkeyword">if</span>startstopdaemonstoptestquietpidfile<spanclass="tokenvariable">PIDFILE --startas $DAEMON ; then
$0 restart
fi
;;
*)
echo “Usage: /etc/init.d/socketcand {start|stop|restart|force-reload}”
exit 1
;;
esac

exit 0

start-stop-daemon守护进程启停工具命令
参数
-S | --start – <argument> 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-q | --quiet 不要输出警告
-b | --background 后台运行
-p | --pidfile <pid-file> 要检查的pid文件
-a | --startas 要启动的程序(默认为<executable>)
-m| --make-pidfile 当命令本身不创建pidfile时,由start-stop-daemon创建
-x | --exec <executable> 程序启动/检查它是否正在运行
-o | --oknodo 如果未执行任何操作,退出状态为0(不是1)

示例:
Start the food daemon, unless one is already running (a process named food, running as user food, with pid in food.pid)
启动food守护进程,除非它已经在运行(一个名为food的进程,以用户food的身份运行,在foo.pid中使用pid):

start-stop-daemon --start --oknodo --user food --name food --pidfile /var/run/food.pid --startas /usr/sbin/food --chuid food -- --daemon

 
 
 
 
  • 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值