米扑科技,这两天需要在Ubuntu中配置开机启动的命令,有很多方式

在rc.local中配置是比较简单方便的一种,所以打算使用rc.local的方式进行配置。

 

rc.local 配置完后,却发现配置的sh脚本始终不执行,开始怀疑是rc.local没执行,用echo打印了些信息,发现都执行了。

这就造成了我的困惑,网上查了好多解决方案,试了好多种方法,最终发现是有shell的问题造成的。

 

有些命令需要在bash shell中运行,而不能在dash中运行。

从Ubuntu 6.10开始,默认使用dash(theDebian Almquist Shell)

而不是bash(the GNUBourne-Again Shell).

但Login Shell还是bash

 

使用命令查了下,看到/bin/sh链接到了/bin/dash(如下)

$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4  2月 19  2014 /bin/sh -> dash

$ ls -al /bin/dash
-rwxr-xr-x 1 root root 121272  2月 19  2014 /bin/dash

$ echo $SHELL
/bin/bash

 

而/etc/rc.local脚本中用的正是/bin/sh,导致命令无法运行。

$ head /etc/rc.local         
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.

 

解决方案:

1. 将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh" 改为 "#!/bin/bash

2. 将/bin/sh重新链接到/bin/bash,方法如下:

终端执行 sudo dpkg-reconfigure dash,然后选择 No

重新进行软链接,执行以下命令:

sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh

这样就将 /bin/sh 链接到了/bin/bash

sudo reboot 系统后,命令正常执行

 

最后注意,如果你在rc.local 中执行脚本的话,

必须使用sudo chmod +x 给脚本增加执行权限。

sudo chmod +x /home/homer/script/mimvp_proxy.sh

有很多人可能会忽略这个问题。

 

总结

以上方法,在我的Ubuntu 14.04系统反复配置多次,仍然不行,开机无法执行

最后的解决方案,参考 Ubuntu 14.04 设置开机启动脚本

1. 把 /etc/rc.local 改名自定义的 /etc/rc_mimvp.sh

sudo cp /etc/rc.local /etc/init.d/rc_mimvp.sh

sudo chmod +x /etc/init.d/rc_mimvp.sh

 

2. 将脚本添加到启动脚本

cd /etc/init.d/

sudo update-rc.d rc_mimvp.sh defaults 90

 

3. 如果要移除启动脚本

sudo update-rc.d -f rc_mimvp.sh remove

 

 

参考推荐

Ubuntu 14.04 设置开机启动脚本

Ubuntu 下关闭apache服务的开机自启动