ubuntu自定义开机启动脚本

喜爱的ubuntu

喜爱ubuntu,可是众多不方便,怎么办?第一弹,我们先学学自己定制开机启动程序。实现方法是定制开机启动脚本,将脚本加入开机启动即可。需要学习的基础知识:如何写脚本,语法是什么,update-rc.d命令的使用。

皓眸大前端开发学习

bash脚本

1
#!/bin/bash是指此脚本使用/bin/bash来解释执行。

其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,…
我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。

注意点1

1
#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。

这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):

1
2
3
4
5
6
7
8
9
10
11
12
13
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"

tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"

tbash3.sh:
source abc
echo "hello abc"

三个脚本执行的结果:

1
2
3
4
5
6
7
8
9
10
11
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行。
[nsvc@localhost other]$ ./tbash2.sh
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:当source命令执行有问题时,bash继续执行下面命令。
[nsvc@localhost other]$ ./tbash3.sh
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。

如果将tbash1.sh改成:

1
2
3
4
echo "abc"
#!/bin/sh
source abc
echo "hello abc"

那么,执行结果是:

1
2
3
4
[nsvc@localhost other]$ ./tbash1.sh 
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc

也就是说,脚本忽略了第二行“#!/bin/sh”,直接使用当前所在的shell(也就是bash)来解释脚本。

当把tbash1.sh改成:

1
2
3
4
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"

执行结果为:

1
2
3
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,不在第一行的#!/bin/bash,只是一个注释。

注意点2

1
#!后面的路径一定要正确,不正确会报错。

假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:

1
2
3
#!/home/sh
source abc
echo "hello abc"

执行结果为:

1
2
3
[nsvc@localhost other]$ ./tbash1.sh 
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file or directory
系统会提示/home/sh的路径不存在。

注意点3

如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:

1
2
3
4
-sh-3.2$ ./tbash3.sh 
./tbash3.sh: line 1: abc: 没有那个文件或目录
与1)中的执行结果是不一样的。
因此,大家应该养成脚本首行加上#!+shell路径的习惯。

注意点4

1
2
3
4
5
/bin/sh相当于/bin/bash --posix
我们将脚本tbash1.sh改为:
#!/bin/bash --posix
source abc
echo "hello abc"

执行结果:

1
2
3
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样。

我们还可以以tbash3.sh为示例。
用以下命令来执行该脚本:

1
2
3
4
5
6
7
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh
tbash3.sh: line 1: abc: No such file or directory

“bash tbash3.sh”表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh 脚本名“这样的命令,来用sh作为脚本解释器。
从结果可以看出,/bin/bash –posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“

最后加上一点说明,每个脚本开头都使用”#!”,#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。

update-rc.d

在Linux系统下,一个Services的启动、停止以及重启通常是通过/etc/init.d目录下的脚本来控制的。然而,在启动或改变运行级别时,是在/etc/rcX.d中来搜索脚本。其中X是运行级别的number。本文将解释如何启动、关闭和修改服务的运行。当你在Debian下安装一个新的服务,比如Apache2,安装完成后,默认情况下它会启动,并在下一次重启后自动启动。但是如果你不是一直需要这个服务,只在需要的时候启用它,你可以禁用它。直到你需要使用的时候,执行如下指令:

1
/etc/init.d/apache2 start

要实现这个目的,你需要先在/etc/rcX.d目录中删除所有apache2的符号链接,但这个方法操作麻烦,且效率低下。因此,我们建议你使用update-rc.d命令来实现这个功能。

删除一个服务

如果你想手动的完全禁用Apache2服务,你需要删除其中的所有在/etc/rcX.d中的单一链路。但是如果使用update-rc.d,则非常简单:

1
update-rc.d -f apache2 remove

参数-f是强制删除符号链接,即使/etc/init.d/apache2仍然存在。 Note:这个命令仅仅禁止该服务,直到该服务被升级。如果你想在服务升级后仍然保持被禁用。应该执行如下的命令:

1
update-rc.d apache2 stop 80 0 1 2 3 4 5 6 .

增加一个服务

如果你想重新添加这个服务并让它开机自动执行,你需要执行以下命令:

1
update-rc.d apache2 defaults

并且可以指定该服务的启动顺序:

1
update-rc.d apache2 defaults 90

还可以更详细的控制start与kill顺序:

1
update-rc.d apache2 defaults 20 80

其中前面的20是start时的运行顺序级别,80为kill时的级别。也可以写成:

1
update-rc.d apache2 start 20 2 3 4 5 . stop 80 0 1 6 .

其中0~6为运行级别。 update-rc.d命令不仅适用Linux服务,编写的脚本同样可以用这个命令设为开机自动运行

创建开机启动脚本

ubuntu的开启启动脚本是放在/etc/init.d目录下,下面在该目录下创建一个简单的脚本verbosestartup.sh:

1
2
#!/bin/bash  
echo "verbose start up"

只是简单地把脚本放到该目录下还不可以,还需要执行下面的命令应用该脚本:

1
sudo update-rc.d verbosestartup.sh defaults

谢谢!

转载请注明出处:http://www.haomou.net/2015/06/04/2015_webpack/
有问题请留言。T_T 皓眸大前端开发学习 T_T