`
fantaxy025025
  • 浏览: 1351196 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

ubuntu rc.local 为何不执行?

 
阅读更多

 

----

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.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution

/opt/stuff/somefancy.error.script.sh

exit 0

 

 

----

默认启动的其实还不是/etc/rc.local而是/etc/init.d/rc.local

 

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
,.if [ -x /etc/rc.local ]; then
,.        [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
,.,./etc/rc.local
,.,.ES=$?
,.,.[ "$VERBOSE" != no ] && log_end_msg $ES 
,.,.return $ES 
,.fi
}

仅仅在dostart函数中启动了/etc/rc.local

可以看出来,在启动这个脚本之前,手动设置了PATH变量(这个很坏吧!)

 

 

----

对于12.04后的ubuntu,这个问题应该不存在了,dash可以兼容决大多数脚本,不信调试一下,几乎不会是dash的问题,而是脚本问题,或者其他文,比如环境变量的问题。

      为了让mysql开机启动,我将mysql命令添加到/etc/rc.local中,但怎么也运行不了。一开始认为只是/etc/rc.local的权限问题,但通过以下命令修改后,还是不起作用。

 

sudo chmod +x /etc/rc.local  // 增加可执行权限

sudo chmod +s /etc/rc.local  // 让普通用户执行该文件时拥有文件所有者的权限

 

      后来Google之后才发现是Ubuntu默认的dash在作怪:

#ls -al /bin/sh 

lrwxrwxrwx 1 root root 4 2009-12-11 06:04 /bin/sh -> dash

#ls -al /bin/dash

-rwxr-xr-x 1 root root 92132 2009-09-21 07:49 /bin/dash

 

      可以看出Ubuntu默认将/bin/sh链接到/bin/dash,而/etc/rc.local脚本中用的正是/bin/sh,导致出错,可以将/etc/rc.local的命令改成更加兼容的模式,或者直接将/bin/sh链接到/bin/bash。

/usr/bin/mystar >& /dev/null &         # dash报错,bash和csh不会报错

/usr/bin/mystar > /dev/null 2>&1     # dash兼容

 

      其实,从 Ubuntu 6.10开始,Ubuntu就将先前默认的bash shell 更换成了dash shell,其表现为 /bin/sh 链接倒了/bin/dash而不是传统的/bin/bash。Ubuntu dgy是第一个将dash作为默认shell来发行的版本,这似乎是受了debian的影响。wiki 里面有官方的解释,https://wiki.ubuntu.com/DashAsBinSh,主要原因是dash更小,运行更快,还与POSIX兼容。但目前存在的问题是,由于shell的更换,致使很多脚本出错,毕竟现在的很多脚本不是100%POSIX兼容。

 

将默认的shell改成bash的方法: 

方法1:在终端执行 sudo dpkg-reconfigure dash,然后选择 no.

 

方法2:重新进行软链接:

sudo rm /bin/sh

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

 

参见:http://blog.163.com/lgh_2002/blog/static/44017526201032803748503/

 

分享到:
评论

相关推荐

    Ubuntu 18.04 启用 rc.local 设置开机启动 - digdeep - 博客园1

    总结来说,Ubuntu 18.04及更高版本中,通过`systemd`启用`rc.local`进行开机启动的过程涉及创建`systemd`服务文件,编辑`rc.local`脚本,赋予执行权限,加载并启动服务,以及验证服务状态。虽然这比直接在旧版系统中...

    ubuntu系统中/etc/rc.local和/etc/init.d/rc.local的区别详解

    我们在ubuntu下要把一个程序加入开机启动,一般可以通过修改rc.local来完成,但ubuntu下有两个rc.local文件。分别是/etc/rc.local和/etc/init.d/rc.local。可以看一下两个文件的内容找到他俩的关系: /etc/init.d/...

    rc.local文件下载

    rc.local文件下载

    Ubuntu 14.04设置开机启动脚本的方法

    rc.local脚本是一个ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。该脚本位于/etc/路径下,需要root权限才能修改。 该脚本具体格式如下: #!/bin/sh -e # # rc.local # # This script is ...

    rc-local.service

    rc-local.service

    linux etc/rc.d 系统启动服务详解

    `/etc/rc.local` 是一个特殊脚本,用于执行系统启动后的自定义命令。用户或管理员可以在此添加任何需要在系统启动后执行的命令,但需注意避免影响系统启动时间。 5. **localnet服务**: "localnet"可能是指在本地...

    Ubuntu 下源码安装Postgresql

    首先,使用 runlevel 命令确认当前 Ubuntu 的运行级别,然后在 rc2.d 目录下添加一个名为 S03rc.local 的文件,并在该文件中添加以下代码: su -c "/softwares/postgresql/bin/pg_ctl start -D /softwares/...

    编译ubuntu驱动.TXT

    /lib/modules/*/build 这个目录,make报错(4)内核编译 CONFIG_MODVERSIONS 作用(5)安装内核源码与相应的头文件(6)载入驱动模块(7)/etc/rc.local 不执行的问题(8)内核升级后,驱动程序要升级,为什么应用...

    ubuntu-设置开机自启动命令-脚本.pdf

    - 对`/etc/rc.local`文件设置可执行权限,命令为:`sudo chmod +x /etc/rc.local`。 - 修改`rc-local.service`文件的权限,使其可以被编辑:`sudo chmod 777 /lib/systemd/system/rc-local.service`。 5. **创建...

    ubuntu 10.04上搭建oracle 11g个人总结

    由于 Ubuntu 10.04 的源中不包含这个包,因此需要手动下载和安装。下载 libstdc++5 的方法如下: wget -c http://lug.mtu.edu/ubuntu/pool/main/g/gcc-3.3/libstdc++5_3.3.6-10_i386.deb 然后,解包 libstdc++5: ...

    Ubuntu PPPOE Server环境搭建说明.pdf

    修改 `/etc/rc.local` 文件,以便于 PPPOE 服务器在开机时自动启动。 Ubuntu PPPOE 服务器环境搭建需要安装 PPPOE 服务器软件,修改配置文件,开启 IP 转发,添加默认网关,增加 NAT 转发,启动 PPPOE 服务器,并...

    Ubuntu 12.04下解决Tomcat自启动问题.docx

    在/etc目录下,有一个名为`rc.local`的文件,这是一个系统启动时运行的脚本。它允许你在多用户运行级别结束时执行自定义命令。你可以使用`vi`文本编辑器打开这个文件,输入`vi rc.local`。 打开文件后,你会看到...

    Mysql_Ubuntu安装.rar

    在Ubuntu系统上安装MySQL是一个常见的任务,特别是在开发和运维环境中。MySQL是一个流行的开源关系型数据库管理系统,被广泛用于存储和管理各种数据。本教程将详细解释如何在Ubuntu上安装MySQL 5.7.31版本,这是...

    linux搭建redis服务器

    在服务器上,你每次重启机器后...root@ubuntu:/usr/local/redis-2.4.14# vim /etc/rc.local 在最后加入下面一行代码 ./usr/local/redis-2.4.14/src/redis-server /usr/local/redis-2.4.14/redis.conf 重启机器看看效果

    Ubuntu禁用软键盘,阻止 caribou(屏幕键盘)弹出.rar

    3. 将脚本添加到系统的启动项中,可以通过修改`~/.bashrc`或`/etc/rc.local`文件来实现。这样,每次登录或开机时,脚本都会自动运行,阻止Caribou启动。 4. 或者,可以将该脚本设置为定时任务(如使用`cron`),每隔...

    UBUNTU开机自启步骤.docx

    为了使某个程序在开机时自动启动,可以通过修改`/etc/rc.d/rc.local`文件来实现。 - 在`/etc/rc.d/rc.local`文件中添加程序启动命令,如`/path/to/yourprogram`。 - 示例:如果希望开机后直接进入图形界面,可以在...

    UBUNTU添加程序开机自动启动的方法

    例如,编辑 /etc/rc.d/rc.local 文件,在文件最末加上一行"xinit"或"startx",可以在开机启动后直接进入 X-Window。 2. 登录时自动运行程序 用户登录时,bash 会自动执行系统管理员建立的全局登录 script :/etc/...

    Ubuntu14.04下安装OpenCV 3.0.RC1.docx

    在Ubuntu 14.04上安装OpenCV 3.0 Release Candidate 1(RC1)是一个涉及多个步骤的过程,主要是为了确保所有必要的依赖项都已安装,源码正确下载并配置,最后编译和安装。以下是详细的操作指南: 1. **系统更新**:...

Global site tag (gtag.js) - Google Analytics