6 Æô¶¯²¢Í£Ö¹¸ß¼¶ÊØ»¤½ø³Ì

¡¡¡¡ÎÒÃÇÀ´¸øÖ®Ç°µÄ ¡°¹Ç¼Ü¡± ½Å±¾¼Óµã ¡°ÑªÈ⡱£¬²¢ÈÃËü¸ü¸´ÔÓ¸ü¸»ÓÐÌØÐÔ°É¡£ ĬÈϵķ½·¨ÒÑÄܹ»ÎªÎÒÃÇ×öºÜºÃµÄ¹¤×÷ÁË£¬ µ«ÊÇÎÒÃÇ¿ÉÄÜ»áÐèÒªËüÃÇһЩ·½ÃæµÄµ÷Õû¡£ ÏÖÔÚÎÒÃǽ«Ñ§Ï°ÈçºÎµ÷ÕûĬÈÏ·½·¨À´·ûºÏÎÒÃǵÄÐèÒª¡£

#!/bin/sh

. /etc/rc.subr

name=mumbled
rcvar=mumbled_enable

command="/usr/sbin/${name}"
command_args="mock arguments > /dev/null 2>&1"(1)

pidfile="/var/run/${name}.pid"(2)

required_files="/etc/${name}.conf /usr/share/misc/${name}.rules"(3)

sig_reload="USR1"(4)

start_precmd="${name}_prestart"(5)
stop_postcmd="echo Bye-bye"(6)

extra_commands="reload plugh xyzzy"(7)

plugh_cmd="mumbled_plugh"(8)
xyzzy_cmd="echo 'Nothing happens.'"

mumbled_prestart()
{
	if checkyesno mumbled_smart; then(9)
		rc_flags="-o smart ${rc_flags}"(10)
	fi
	case "$mumbled_mode" in
	foo)
		rc_flags="-frotz ${rc_flags}"
		;;
	bar)
		rc_flags="-baz ${rc_flags}"
		;;
	*)
		warn "Invalid value for mumbled_mode"(11)
		return 1(12)
		;;
	esac
	run_rc_command xyzzy(13)
	return 0
}

mumbled_plugh()(14)
{
	echo 'A hollow voice says "plugh".'
}

load_rc_config $name
run_rc_command "$1"
(1)
¸½¼Ó¸ø $command µÄ²ÎÊýÔÚ command_args ÖнøÐд«µÝ¡£ËüÃÇÔÚ $mumbled_flags Ö®ºó½«±»Ìí¼Óµ½ÃüÁîÐС£ Æäʵ¼ÊµÄÖ´ÐбãÊǴ˺ó×îÖÕµÄÃüÁîÐд«µÝ¸ø eval ÔËË㣬ÊäÈëºÍÊä³öÒÔ¼°Öض¨Ïò¶¼¿ÉÒÔÔÚ command_args ÖÐÖ¸¶¨¡£

×¢Òâ: ÓÀÔ¶²»Òª ÔÚ command_args °üº¬ÆÆÕÛºÅÑ¡Ï ÀàËÆ -X »ò --foo ÕâÑùµÄ¡£command_args µÄÄÚÈݽ«³öÏÖÔÚ×îÖÕÃüÁîÐеÄĩ⣬Òò´ËËüÃÇ¿ÉÄÜÊǽô½ÓÔÚ ${name}_flags ÖÐËùÁгöµÄ²ÎÊýºóÃæ£» µ«´ó¶àµÄÃüÁ²»ÄÜʶ±ð³öÆÕͨ²ÎÊýºóµÄÆÆÕÛºÅÑ¡Ïî¡£ ¸üºÃµÄ´«µÝ¸½¼Ó¸ø $command µÄÑ¡ÏîµÄ·½Ê½ÊÇÌí¼ÓËüÃǵ½ ${name}_flags µÄÆðʼ´¦¡£ÁíÒ»ÖÖ·½·¨ÊÇÏñºóÎÄËùʾµÄÄÇÑùÀ´ÐÞ¸Ä rc_flags¡£

(2)
Ò»¸öµÃÌåµÄÊØ»¤½ø³Ì»á´´½¨Ò»¸ö pidfile ½ø³ÌÎļþ£¬ ÒÔʹÆä½ø³ÌÄܹ»¸üÈÝÒ׸ü¿É¿¿µØ±»ÕÒµ½¡£Èç¹ûÉèÖÃÁË pidfile ±äÁ¿£¬¸æËß rc.subr(8) ÄÄÀïÄÜÕÒµ½¹©ÆäĬÈÏ·½·¨ËùʹÓÃµÄ pidfile ½ø³ÌÎļþ¡£

×¢Òâ: ÊÂʵÉÏ£¬rc.subr(8) ÔÚÆô¶¯Ò»¸öÊØ»¤½ø³Ìǰ»¹»áʹÓà pidfile ½ø³ÌÎļþÀ´²é¿´ËüÊÇ·ñÒѾ­ÔÚÔËÐС£Ê¹ÓÃÁË faststart ²ÎÊý¿ÉÒÔÌø¹ýÕâ¸ö¼ì²é²½Öè¡£

(3)
Èç¹ûÊØ»¤½ø³ÌÖ»ÓÐÔÚÈ·¶¨µÄÎļþ´æÔÚµÄÇé¿öϲſÉÒÔÔËÐУ¬ ÄǾͽ«ËüÃÇÁе½ required_files ÖУ¬¶ø rc.subr(8) ½«ÔÚÆô¶¯ÊØ»¤½ø³Ì֮ǰ¼ì²éÄÇЩÎļþÊÇ·ñ´æÔÚ¡£ »¹ÓÐÏà¹ØµÄ·Ö±ðÓÃÀ´¼ì²éĿ¼ºÍ»·¾³±äÁ¿µÄ required_dirs ºÍ required_vars ¿É¹©Ê¹Óá£ËüÃǶ¼ÔÚ rc.subr(8) ÖÐÓÐÏêϸµÄ˵Ã÷¡£

×¢Òâ: À´×Ô rc.subr(8) µÄĬÈÏ·½·¨£¬Í¨¹ýʹÓà forcestart ×÷Ϊ½Å±¾µÄ²ÎÊý£¬ ¿ÉÒÔÇ¿ÖÆÐÔµØÌø¹ýÔ¤ÏÈÐèÒªµÄ¼ì²é¡£

(4)
ÎÒÃÇ¿ÉÒÔÔÚÊØ»¤½ø³ÌÓÐÒì³£µÄʱºò£¬×Ô¶¨Òå·¢Ë͸øÊØ»¤½ø³ÌµÄÐźš£ ÌØ±ðÊÇ£¬sig_reload Ö¸¶¨ÁËÊ¹ÊØ»¤½ø³ÌÖØÐÂ×°ÔØÆäÅäÖõÄÐźţ»Ä¬ÈÏÇé¿öÒ²¾ÍÊÇ SIGHUP Ðźš£ ÁíÒ»¸öÐźÅÊÇ·¢Ë͸øÊØ»¤½ø³ÌÒÔÍ£Ö¹¸Ã½ø³Ì£»Ä¬ÈÏÇé¿öÏÂÊÇ SIGTERM Ðźţ¬µ«ÕâÊÇ¿ÉÒÔͨ¹ýÉèÖà sig_stop À´½øÐÐÊʵ±¸ü¸ÄµÄ¡£

×¢Òâ: ÐźÅÃû³ÆÓ¦µ±ÒÔ²»°üº¬ SIG ǰ׺µÄÐÎʽָ¶¨¸ø rc.subr(8)£¬¾ÍÈç·¶ÀýÖÐËùʾµÄÄÇÑù¡£ FreeBSD °æ±¾µÄ kill(1) ³ÌÐòÄܹ»Ê¶±ð³ö SIG ǰ׺£¬²»¹ýÆäËüϵͳ°æ±¾µÄ¾Í²»Ò»¶¨ÁË¡£

(5)(6)
ÔÚĬÈϵķ½·¨Ç°Ãæ»òºóÃæÖ´Ðи½¼ÓÈÎÎñÊǺÜÈÝÒ׵ġ£ ¶ÔÓÚÎÒÃǽű¾ËùÖ§³ÖµÄÿÌõÃüÁî²ÎÊý¶øÑÔ£¬ÎÒÃÇ¿ÉÒÔ¶¨Òå argument_precmd ºÍ argument_postcmd À´Íê³É¡£ÕâЩ sh(1) ÃüÁî·Ö±ðÔÚËüÃǸ÷×Եķ½·¨Ç°ºó±»µ÷Ó㬠ÏÔÈ»£¬´ÓËüÃǸ÷×ÔµÄÃû×Ö¾ÍÄÜ¿´³öÀ´¡£

×¢Òâ: Èç¹ûÎÒÃÇÐèÒªµÄ»°£¬ÓÃ×Ô¶¨ÒåµÄ argument_cmd ¸ÄдĬÈϵķ½·¨£¬²¢²»·Á°­ÎÒÃÇÈÔȻʹÓà argument_precmd ºÍ argument_postcmd¡£ ÌØ±ðÊÇ£¬Ç°Õß±ãÓÚ¼ì²é×Ô¶¨ÒåµÄ·½·¨£¬ ÒÔ¼°Ö´ÐÐ×ÔÉíÃüÁî֮ǰËùÓöµ½¸üÑÏÃܵÄÌõ¼þ¡£ÓÚÊÇ£¬½« argument_precmd ºÍ argument_cmd Ò»ÆðʹÓã¬Ê¹ÎÒÃǺÏÀíµØ½«¼ì²é´Ó¶¯×÷ÖжÀÁ¢Á˳öÀ´¡£

±ðÍüÁËÄã¿ÉÒÔ½«ÈÎÒâµÄÓÐЧµÄ sh(1) ±í´ïʽ²åÈëµ½·½·¨ºÍÄ㶨ÒåµÄ pre- Óë post-commands ÃüÁîÖС£ Ôڴ󲿷ÖÇé¿öÏ£¬µ÷Óú¯Êýʹʵ¼ÊÈÎÎñÓкõķç¸ñ£¬ µ«Ç§Íò²»ÒªÈ÷ç¸ñÏÞÖÆÁËÄã¶ÔÆäÄ»ºóµ½µ×ÊÇÔõô»ØÊµÄ˼¿¼¡£

(7)
Èç¹ûÎÒÃÇÔ¸ÒâʵÏÖһЩ×Ô¶¨Òå²ÎÊý£¬ ÕâЩ²ÎÊýÒ²¿É±»ÈÏ×÷ΪÎÒÃǽű¾µÄ ÃüÁÎÒÃÇÐèÒªÔÚ extra_commands Öн«ËüÃÇÁгö²¢Ìṩ·½·¨ÒÔ´¦ÀíËüÃÇ¡£

×¢Òâ: reload ÊǸöÌØ±ðµÄÃüÁî¡£Ò»·½Ã棬 ËüÓÐÒ»¸öÔÚ rc.subr(8) ÖÐÔ¤Öõķ½·¨¡£ÁíÒ»·½Ã棬 reload ÃüÁîĬÈÏÊDz»±»ÌṩµÄ¡£ ÀíÓÉÊDz¢·ÇËùÓеÄÊØ»¤½ø³Ì¶¼Ê¹ÓÃͬÑùµÄÖØÔØ·½·¨£¬ ²¢ÇÒÓÐÐ©ÊØ»¤½ø³Ì¸ù±¾Ã»ÓÐÈκζ«Î÷¿ÉÖØÔØµÄ¡£ËùÒÔÏÔ¶øÒ×¼û£¬ ÎÒÃÇÐèҪȥѯÎʶ¼ÌṩÁËÄÄЩµÄÄÚ½¨¹¦ÄÜ¡£ÎÒÃÇ¿ÉÒÔͨ¹ý extra_commands À´ÕâÑù×ö¡£

ÎÒÃÇ´Ó reload µÄĬÈÏ·½·¨µÃµ½ÁËÊ²Ã´ÄØ£¿ ÊØ»¤½ø³Ì³£³£ÔÚÊÕµ½Ò»¸öÐźźóÖØÐÂÔØÈëËüÃǵÄÅäÖà ©¤©¤ Ò»°ãÀ´Ëµ£¬Ò²¾ÍÊÇ SIGHUP Ðźš£Òò´Ë rc.subr(8) ³¢ÊÔ·¢ËÍÒ»¸öÐźŸøÊØ»¤½ø³ÌÀ´ÖØÔØËü¡£ ¸ÃÐźÅÒ»°ãÔ¤ÉèΪ SIGHUP£¬ µ«ÊÇÈç¹û±ØÒªµÄ»°¿ÉÒÔͨ¹ý sig_reload ±äÁ¿À´×Ô¶¨ÒåËü¡£

(8)(14)
ÎÒÃǵĽű¾ÌṩÁËÁ½¸ö·Ç±ê×¼µÄÃüÁ plugh ºÍ xyzzy¡£ ÎÒÃÇ¿´µ½ËüÃÇÔÚ extra_commands Öб»ÁгöÀ´ÁË£¬ ²¢ÇÒÏÖÔÚÊÇʱºò¸øËüÃÇÌṩ·½·¨ÁË¡£xyzzy µÄ·½·¨ÊÇÄÚÁªµÄ¶ø plugh µÄÊÇÒÔ mumbled_plugh ÐÎʽÍê³ÉµÄº¯Êý¡£

·Ç±ê×¼ÃüÁîÔÚÆô¶¯»òÍ£Ö¹µÄʱºò²»±»µ÷Óᣠͨ³£ËüÃÇÊÇΪÁËϵͳ¹ÜÀíÔ±µÄ·½±ã¡£ËüÃÇ»¹Äܱ»ÆäËüµÄ×ÓϵͳËùʹÓ㬠ÀýÈ磬devd(8)£¬Ç°ÌáÊÇ devd.conf(5) ÖÐÒѾ­Ö¸¶¨ÁË¡£

È«²¿¿ÉÓÃÃüÁîµÄÁÐ±í£¬µ±½Å±¾²»¼Ó²ÎÊýµØµ÷ÓÃʱ£¬ÔÚ rc.subr(8) ´òÓ¡³öµÄʹÓ÷½·¨ÖÐÄܹ»ÕÒµ½¡£ÀýÈ磬 Õâ¾ÍÊǹ©Ñ§Ï°µÄ½Å±¾Ó÷¨µÄÄÚÈÝ£º

# /etc/rc.d/mumbled
Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)
(13)
Èç¹û½Å±¾ÐèÒªµÄ»°£¬Ëü¿ÉÒÔµ÷ÓÃ×Ô¼ºµÄ±ê×¼»ò·Ç±ê×¼µÄÃüÁî¡£ Õâ¿ÉÄÜ¿´ÆðÀ´ÓеãÏñº¯ÊýµÄµ÷Ó㬵«ÎÒÃÇÖªµÀ£¬ÃüÁîºÍ shell º¯Êý²¢·ÇÒ»Ö±¶¼ÊÇͬÑùµÄ¶«Î÷¡£¾Ù¸öÀý×Ó£¬xyzzy ÔÚÕâÀï²»ÊÇÒÔº¯ÊýÀ´ÊµÏֵġ£ÁíÍ⣬»¹ÓÐÓ¦¸Ã±»ÓÐÐòµ÷ÓÃµÄ pre-command Ô¤ÖÃÃüÁîºÍ post-command ºóÖÃÃüÁî¡£ ËùÒԽű¾ÔËÐÐ×Ô¼ºÃüÁîµÄºÏÊÊ·½Ê½¾ÍÊÇÀûÓà rc.subr(8)£¬ ¾ÍÏñ·¶ÀýÖÐչʾµÄÄÇÑù¡£
(9)
rc.subr(8) ÌṩÁËÒ»¸ö·½±ãµÄº¯Êý½Ð×ö checkyesno¡£ ËüÒÔÒ»¸ö±äÁ¿Ãû×÷Ϊ²ÎÊý²¢·µ»ØÒ»¸öΪÁãµÄÍ˳öÖµ£¬ µ±ÇÒ½öµ±¸Ã±äÁ¿ÉèÖÃΪ YES£¬»ò TRUE£¬»ò ON£¬»ò 1£¬Çø·Ö´óСд£»·ñÔò·µ»ØÒ»¸ö·ÇÁãµÄÍ˳öÖµ¡£ ÔÚµÚ¶þÖÖÇé¿öÖУ¬º¯Êý²âÊÔ±äÁ¿µÄÉèÖÃΪ NO£¬ FALSE£¬OFF£¬»ò 0£¬Çø·Ö´óСд£» Èç¹û±äÁ¿°üº¬±ðµÄÄÚÈݵϰËü´òÓ¡Ò»Ìõ¾¯¸æÐÅÏ¢£¬ÀýÈ磬À¬»ø¡£

ÇÐ¼Ç¶Ô sh(1) ¶øÑÔÁãÖµÒâζ×ÅÕæ¶ø·ÇÁãÖµÒâζ׿١£

ÖØÒª: checkyesno º¯ÊýʹÓÃÒ»¸ö ±äÁ¿Ãû¡£²»ÒªÀ©´óº¬Ò彫±äÁ¿µÄ Öµ ´«µÝ¸øËü£» ·ñÔòËü²»»áÈçÄãÔ¤ÆÚÄÇÑùµÄ¹¤×÷¡£

ÏÂÃæÊÇ checkyesno µÄºÏÀíʹÓ÷¶Î§£º

if checkyesno mumbled_enable; then
        foo
fi

Ïà·´µØ£¬ÒÔÏÂÃæµÄ·½Ê½µ÷Óà checkyesno ÊDz»»á¹¤×÷µÄ -- ÖÁÉÙÊDz»»áÈçÄãÔ¤ÆÚµÄÄÇÑù£º

if checkyesno "${mumbled_enable}"; then
        foo
fi
(10)
ÎÒÃÇ¿ÉÒÔͨ¹ýÐÞ¸Ä $start_precmd ÖÐµÄ rc_flags À´Ó°Ïì´«µÝµ½ $command µÄ±êÖÄ¡£
(11)
ijÖÖÇé¿öÏÂÎÒÃÇ¿ÉÄÜÐèÒª·¢³öÒ»ÌõÖØÒªµÄÐÅÏ¢£¬ÄÇÑùµÄ»° syslog ¿ÉÒԺܺõؼǼÈÕÖ¾¡£ Õâ¿ÉÒÔʹÓÃÏÂÁÐ rc.subr(8) º¯ÊýÀ´ÇáËÉÍê³É£º debug£¬info£¬ warn£¬ÒÔ¼° err¡£ ºóÕßÒÔÖ¸¶¨µÄ´úÂëÖµÍ˳ö½Å±¾¡£
(12)
·½·¨µÄÍ˳öÖµºÍËüÃÇµÄ pre-commands Ô¤ÃüÁî²»Ö»ÊÇĬÈϱ»ºöÂÔµô¡£Èç¹û argument_precmd ·µ»ØÁËÒ»¸ö·ÇÁãÍ˳öÖµ£¬Ö÷·½·¨½«²»»á±»Ö´ÐС£ÒÀ´ÎµØÊÇ£¬ argument_postcmd ½«²»»á±»µ÷Ó㬳ý·ÇÖ÷·½·¨·µ»ØµÄÊÇÒ»¸öΪÁãµÄÍ˳öÖµ¡£

×¢Òâ: È»¶ø£¬µ±¸øÒ»¸ö²ÎÊýʹÓà force ǰ׺µÄʱºò£¬Èç forcestart£¬rc.subr(8) »áÌý´ÓÃüÁîÐÐָʾ¶øºöÂÔÄÇЩÍ˳öÖµ×îºóÈÔÈ»µ÷ÓÃËùÓеÄÃüÁî¡£

±¾ÎĵµºÍÆäËüÎĵµ¿É´ÓÕâÀïÏÂÔØ£ºftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Èç¹û¶ÔÓÚFreeBSDÓÐÎÊÌ⣬ÇëÏÈÔĶÁÎĵµ£¬Èç²»Äܽâ¾öÔÙÁªÏµ<questions@FreeBSD.org>.
¹ØÓÚ±¾ÎĵµµÄÎÊÌâÇë·¢ÐÅÁªÏµ <doc@FreeBSD.org>.