最近给系统加自启动,遇到一些问题,记录以备查,系统使用的是Ubuntu 16.04

  • 确保/etc/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.

exit 0


  • /etc/rc.local使用/bin/sh执行而不是/bin/bash,两者支持的特性有所区别,比如sh不支持source命令,不支持&>方式的标准和错误重定向,写语句时需要注意区分

  • 编辑好后自启动脚本没有生效,可能执行失败,但是看不到日志,可以在rc.local最前面加入重定向命令,将标准和错误输出重定向到文件以便排查错误,如

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

另外使用systemctl status rc.local.service可以查看rc.local服务启动情况

  • 执行rc.local是root用户,一般将自启动脚本写在别的位置,然后使用su指定用户来执行。其中,-选项提供一个类似于用户直接登录的环境,与-l和--login是一个意思;-c指定一个由shell执行的命令。可以先执行下su命令查看是否正确再查看是否能正常自启
su - user_name -c '/path/to/script.sh'
  • 在script.sh中,命令的标准和错误输出最好都重定向到指定文件以便排查错误,错误一般出现在环境变量配置。运行script.sh的shell为/etc/passwd中确定,使用man su可以查看详情

参考文章:

https://blog.csdn.net/21aspnet/article/details/6826659

https://askubuntu.com/questions/434242/where-is-log-file-from-rc-local

https://askubuntu.com/questions/294736/run-a-shell-script-as-another-user-that-has-no-password