·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
基本组成
1、首先,要在开头加上“#!/bin/sh”,声明shell路径。如果不加的话,在开机时会遇到无法执行的问题。
2、然后是这样一个类似的声明部分(声明部分直接影响启动顺序):
### BEGIN INIT INFO
# Provides: scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
3、然后是要执行的脚本
4、最后是返回值(最好有,否则甚至可能导致崩溃)
exit 0
示例
这里是我根据powertop优化建议写的一个开机脚本,用来优化电源管理。
#!/bin/sh
### BEGIN INIT INFO
# Provides: powertop-rc
# Required-Start: $remote_fs $syslog $all
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start powertop auto tune at boot time
# Description: Start powertop auto tune at boot time to save power.
### END INIT INFO
ethtool -s eth0 wol d;
iw dev wlan0 set power_save on
echo '0' > '/proc/sys/kernel/nmi_watchdog';
echo 'min_power' > '/sys/class/scsi_host/host4/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host5/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host3/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy';
echo '1' > '/sys/module/snd_hda_intel/parameters/power_save';
echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy';
echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';
echo 'auto' > '/sys/bus/usb/devices/3-1.2/power/control';
echo 'auto' > '/sys/bus/usb/devices/3-1.3/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:01.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:02.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:14.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:16.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1b.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.1/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1d.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.2/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.3/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:03:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:04:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:05:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1a.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.3/power/control';
exit 0
参数
下面是针对声明部分一些参数的解释(根据debian wiki翻译)
Provides: boot_facility_1 [boot_facility_2…]
Provides栏对应的是启动项的名称,默认地,可以直接使用脚本的文件名(去掉.sh)为启动项名称,但Provides能给启动项提供别名。注意启动项的名称不能和其它启动项冲突,并且不能以’$’开头。Required-Start: boot_facility_1 [boot_facility_2…] 和 Required-Stop: boot_facility_1 [boot_facility_2…]
这两项分别定义该启动项要在哪些启动项启动之后启动和必须在哪些项终止之前终止。通常两者的参数是相同的。如果缺省,则意味着脚本没有什么依赖,在bootstrap之后(挂载本地文件系统之前)就将被执行。Should-Start: boot_facility_1 [boot_facility_2…] 和 Should-Stop: boot_facility_1 [boot_facility_2…]
用法和Required-Start/Stop类似,唯一的不同是即使列出的依赖项没有启动(或终止),该启动项仍能启动(或终止)。Default-Start: run_level_1 [run_level_2…] 和 Default-Stop: run_level_1 [run_level_2…]
定义该启动项应该在哪些运行级别执行。比如一个启动项应该在运行级别3,4,5运行,那么这里就应该写”Default-Start: 3 4 5” and “Default-Stop: 0 1 2 6”Short-Description 和 Description
同为描述。前者限制一行,后者允许多行。注意Description的每一行都要求以’#’加两个空格或一个tab开头。
补充
几个虚拟启动项的名字和作用
- $local_fs 所有文件系统都被挂载,但是/usr等一些目录可能不被挂载。
- $remote_fs 所有文件系统都被挂载,包括/usr等目录,可以认为remote_fs包括local_fs
- $syslog 允许使用系统日志
- $all 尽量使该启动项最后执行(只适用于启动顺序,不是用于终止顺序)
LSB运行级别
- 0 关机
- 1 单用户模式,为管理任务准备
- 2 多用户模式,没有网络设备
- 3 带网络设备的多用户模式
- 4 给用户预留的(一般不用)
- 5 正常启动系统(带图形界面)
- 6 重启
启用和停用脚本
1、把脚本cp至/etc/init.d/目录下,然后chmod +x赋予可执行权限。
2、然后执行
update-rc.d test.sh defaults
其中test.sh替换为具体文件名。
3、若要停用脚本,删除test.sh然后执行
update-rc.d test.sh remove