----
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及更高版本中,通过`systemd`启用`rc.local`进行开机启动的过程涉及创建`systemd`服务文件,编辑`rc.local`脚本,赋予执行权限,加载并启动服务,以及验证服务状态。虽然这比直接在旧版系统中...
我们在ubuntu下要把一个程序加入开机启动,一般可以通过修改rc.local来完成,但ubuntu下有两个rc.local文件。分别是/etc/rc.local和/etc/init.d/rc.local。可以看一下两个文件的内容找到他俩的关系: /etc/init.d/...
rc.local文件下载
rc.local脚本是一个ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。该脚本位于/etc/路径下,需要root权限才能修改。 该脚本具体格式如下: #!/bin/sh -e # # rc.local # # This script is ...
rc-local.service
`/etc/rc.local` 是一个特殊脚本,用于执行系统启动后的自定义命令。用户或管理员可以在此添加任何需要在系统启动后执行的命令,但需注意避免影响系统启动时间。 5. **localnet服务**: "localnet"可能是指在本地...
首先,使用 runlevel 命令确认当前 Ubuntu 的运行级别,然后在 rc2.d 目录下添加一个名为 S03rc.local 的文件,并在该文件中添加以下代码: su -c "/softwares/postgresql/bin/pg_ctl start -D /softwares/...
/lib/modules/*/build 这个目录,make报错(4)内核编译 CONFIG_MODVERSIONS 作用(5)安装内核源码与相应的头文件(6)载入驱动模块(7)/etc/rc.local 不执行的问题(8)内核升级后,驱动程序要升级,为什么应用...
- 对`/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 的源中不包含这个包,因此需要手动下载和安装。下载 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: ...
修改 `/etc/rc.local` 文件,以便于 PPPOE 服务器在开机时自动启动。 Ubuntu PPPOE 服务器环境搭建需要安装 PPPOE 服务器软件,修改配置文件,开启 IP 转发,添加默认网关,增加 NAT 转发,启动 PPPOE 服务器,并...
在/etc目录下,有一个名为`rc.local`的文件,这是一个系统启动时运行的脚本。它允许你在多用户运行级别结束时执行自定义命令。你可以使用`vi`文本编辑器打开这个文件,输入`vi rc.local`。 打开文件后,你会看到...
在Ubuntu系统上安装MySQL是一个常见的任务,特别是在开发和运维环境中。MySQL是一个流行的开源关系型数据库管理系统,被广泛用于存储和管理各种数据。本教程将详细解释如何在Ubuntu上安装MySQL 5.7.31版本,这是...
在服务器上,你每次重启机器后...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 重启机器看看效果
3. 将脚本添加到系统的启动项中,可以通过修改`~/.bashrc`或`/etc/rc.local`文件来实现。这样,每次登录或开机时,脚本都会自动运行,阻止Caribou启动。 4. 或者,可以将该脚本设置为定时任务(如使用`cron`),每隔...
为了使某个程序在开机时自动启动,可以通过修改`/etc/rc.d/rc.local`文件来实现。 - 在`/etc/rc.d/rc.local`文件中添加程序启动命令,如`/path/to/yourprogram`。 - 示例:如果希望开机后直接进入图形界面,可以在...
例如,编辑 /etc/rc.d/rc.local 文件,在文件最末加上一行"xinit"或"startx",可以在开机启动后直接进入 X-Window。 2. 登录时自动运行程序 用户登录时,bash 会自动执行系统管理员建立的全局登录 script :/etc/...
在Ubuntu 14.04上安装OpenCV 3.0 Release Candidate 1(RC1)是一个涉及多个步骤的过程,主要是为了确保所有必要的依赖项都已安装,源码正确下载并配置,最后编译和安装。以下是详细的操作指南: 1. **系统更新**:...