ubuntu 开机自启动服务 和 GUI 软件

Posted by wxianfeng Thu, 07 May 2009 13:30:00 GMT

环境:ubuntu 10.10

每天上班的第一件事就是开电脑 , 开一些工作上必须用的软件 或者一些服务 , 每天 都要动你的鼠标 去打开 应用程序 或者 在terminal 上敲命令启动 服务,这样 未免 太麻烦了 ,一点也不 DRY , 那就 把你每天必备的 服务 , 都放在 rc.local中 或者使用 update-rc.d , GUI 软件放到 startup applications 中 随着 开机一起启动吧

开机 自启动服务

使用 rc.local

1,把你需要 启动的 程序都放到 /etc/rc.local 中,注意写到 exit 0 前面

2,默认 ubuntu 的 shell 是 dash ,据说 是为了 提高 开机速度

wxianfeng@ubuntu:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2010-11-12 19:12 /bin/sh -> dash

但是 dash 是一个 对脚本 兼容性 和 容错性 非常差的 shell,修改 rc.local 用 bash 来执行不要使用 dash

#!/bin/sh

改为

#!/bin/bash

或者直接修改 ubuntu 默认shell

wxianfeng@ubuntu:~$ ll /bin/sh
lrwxrwxrwx 1 root root 4 2010-11-12 19:12 /bin/sh -> dash*
wxianfeng@ubuntu:~$ sudo dpkg-reconfigure dash # 选择 NO
wxianfeng@ubuntu:~$ ll /bin/sh
lrwxrwxrwx 1 root root 4 2010-12-24 10:37 /bin/sh -> bash*

3,服务 无法 开启 daemon(守护进程) 的 用 nohup 启动 ,例如 mongodb

4,确保 文件的执行权限 登录的普通用户可以使用 , 默认 ubuntu 登录 是非 root 账户

修改前:

wxianfeng@ubuntu:~$ ll /etc/rc.local
-rwxr-xr-x 1 root root 736 2010-12-24 09:35 /etc/rc.local*

修改:

wxianfeng@ubuntu:~$ sudo chgrp -R wxianfeng /etc/rc.local
wxianfeng@ubuntu:~$ sudo chown -R wxianfeng /etc/rc.local 

修改后:

wxianfeng@ubuntu:~$ ll /etc/rc.local
-rwxr-xr-x 1 wxianfeng wxianfeng 736 2010-12-24 09:35 /etc/rc.local*

5,把 rc.local 中的 第一行 -e 给去掉

-e 参数 是 脚本遇到 错误 就退出 , 这个 很不好 , 可以 man sh 看下 -e 参数:

>man sh
-e errexit       If not interactive, exit immediately if any untested command fails.  The exit status of a command is considered to be explicitly tested if the
                            command is used to control an if, elif, while, or until; or if the command is the left hand operand of an “&&” or “||” operator.

6,DEMO:

wxianfeng@ubuntu:~$ cat /etc/rc.local 
#!/bin/bash 
#
# 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.

/etc/init.d/mysql start # 启动 mysql
exit 0

说了 那么多 , 说下 rc.local 的 启动原理:

ubuntu 的开机的时候 会根据当前的 运行级别 即 runlevel

wxianfeng@ubuntu:~$ runlevel
N 2

可以看出是2 ,然后 通过 runlevel 执行 /etc/rc*.d 下的 所有文件 ,这里即 rc2.d

wxianfeng@ubuntu:~$ ll /etc/rc2.d/
total 20
drwxr-xr-x   2 root root  4096 2010-12-06 10:30 ./
drwxr-xr-x 141 root root 12288 2010-12-24 11:04 ../
-rw-r--r--   1 root root   677 2010-09-25 02:16 README
lrwxrwxrwx   1 root root    20 2010-11-12 19:12 S20fancontrol -> ../init.d/fancontrol*
lrwxrwxrwx   1 root root    20 2010-11-12 19:12 S20kerneloops -> ../init.d/kerneloops*
lrwxrwxrwx   1 root root    27 2010-11-12 19:12 S20speech-dispatcher -> ../init.d/speech-dispatcher*
lrwxrwxrwx   1 root root    24 2010-12-06 10:30 S20virtualbox-ose -> ../init.d/virtualbox-ose*
lrwxrwxrwx   1 root root    19 2010-11-12 19:12 S25bluetooth -> ../init.d/bluetooth*
lrwxrwxrwx   1 root root    20 2010-11-12 19:12 S50pulseaudio -> ../init.d/pulseaudio*
lrwxrwxrwx   1 root root    15 2010-11-12 19:12 S50rsync -> ../init.d/rsync*
lrwxrwxrwx   1 root root    15 2010-11-12 19:12 S50saned -> ../init.d/saned*
lrwxrwxrwx   1 root root    19 2010-11-12 19:12 S70dns-clean -> ../init.d/dns-clean*
lrwxrwxrwx   1 root root    18 2010-11-12 19:12 S70pppd-dns -> ../init.d/pppd-dns*
lrwxrwxrwx   1 root root    14 2010-11-12 19:12 S75sudo -> ../init.d/sudo*
lrwxrwxrwx   1 root root    24 2010-11-12 19:12 S90binfmt-support -> ../init.d/binfmt-support*
lrwxrwxrwx   1 root root    17 2010-11-15 13:45 S91apache2 -> ../init.d/apache2*
lrwxrwxrwx   1 root root    22 2010-11-12 19:12 S99acpi-support -> ../init.d/acpi-support*
lrwxrwxrwx   1 root root    21 2010-11-12 19:12 S99grub-common -> ../init.d/grub-common*
lrwxrwxrwx   1 root root    18 2010-11-12 19:12 S99ondemand -> ../init.d/ondemand*
lrwxrwxrwx   1 root root    18 2010-11-12 19:12 S99rc.local -> ../init.d/rc.local*

可以 看到 S99rc.local 软链接 从 /etc/init.d/rc.local 过来的 ,打开 看看 ,这里有 调用 /etc/rc.local 的文件 ,/etc/rc.local 也就是 从这里启动的:

wxianfeng@ubuntu:~$ cat /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
}

case "$1" in
    start)
        do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

使用 update-rc.d

apache 开机自启动

>sudo update-rc.d apache2 defaults

mysql 开机自启动

>sudo update-rc.d mysql defaults

开机 启动 GUI 软件

上面 是 开机 启动一些服务 ,例如 mysql ,apache 啥的 ,但是 开机启动一些软件 怎么办,例如 netbeans , eclipse 等

ubuntu 已经 给了我们 gui的配置工具

system -> prefences -> start applications

把所有启动的 GUI 软件 放到一个 shell 里,然后 添加 启动这个shell 即可:

wxianfeng@ubuntu:~$ cat /usr/local/system/shell/autostart.sh 
#!/bin/sh 

nohup /usr/local/system/netbeans6_9/bin/netbeans --locale zh_CN.UTF-8  & # 启动netbeans 
nohup firefox & # 启动 firefox 可以 默认开启一个网页 firefox wxianfeng.com
nohup /opt/google/chrome/google-chrome & # 启动 chrome
nohup guake & # 启动guake
nohup emesene & # 启动 emesene (ubuntu MSN客户端)
nohup empathy & # 启动 empathy (登录gtalk之用)

添加 过后 其实 是在 ~/.config/autostart 目录下 建立了一个新的.desktop启动文件

cd ~/.config/autostart/
wxianfeng@ubuntu:~/.config/autostart$ ll
total 12
drwx------  2 wxianfeng wxianfeng 4096 2010-12-24 11:03 ./
drwxr-xr-x 18 wxianfeng wxianfeng 4096 2010-12-24 11:03 ../
-rw-r--r--  1 wxianfeng wxianfeng  266 2010-12-24 11:03 autostart.sh.desktop
wxianfeng@ubuntu:~/.config/autostart$ cat autostart.sh.desktop 

[Desktop Entry]
Type=Application
Exec=/usr/local/system/shell/autostart.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=autostart_shell
Name=autostart_shell
Comment[en_US]=start GUI software when boot
Comment=start GUI software when boot

也就是说 这个文件 你可以 手动建立 , 从里面可以看出 我开机启动的 shell 脚本 路径在 /usr/local/system/shell/autostart.sh

注意点:

刚开始 我想把我的 gui 软件 启动也放到rc.local 中 ,这个 是不允许的 ,rc.local 只能启动服务,不能启动 图形界面的 程序

see:

http://www.bettershop.com.cn/bbs/read.php?tid-1029.html http://blog.163.com/lgh_2002/blog/static/44017526201032803748503 http://www.ihacklog.com/linux/tips-linux/fcitx-autostart-via-rc-local.htm

This entry was posted on Thu, 07 May 2009 13:30:00 GMT and Posted in . You can follow any any response to this entry through the Atom feed. You can leave a comment or a trackback from your own site.

Tags , , ,


Trackbacks

Use the following link to trackback from your own site:
http://wxianfeng.com/trackbacks?article_id=147

Comments

  1. Avatar
    lee over {{count}} years ago:

    开机 启动 GUI 软件

    不是很明白

  2. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    像apache ,mysql , nginx 这些没有GUI
    像Netbeans,Eclipse,TextMate 这些就是有 GUI

  3. Avatar
    lee over {{count}} years ago:

    找不到/usr/local/system/shell/autostart.sh
    我的10.10在/usr/local/目录下木有system这个目录!

  4. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    这个是我自建的目录和文件,你可以放在你想放的地方,例如 /home/ 下

  5. Avatar
    lee over {{count}} years ago:

    额…明白啦!那个~我想问~那些脚本怎么写!我看不懂!比如说启动一个程序!在脚本里面怎么写呢?linux系统是不是有这些命令!请指教!

  6. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    是的
    都有的,例如启动 mysql /etc/init.d/mysql start
    启动 nginx /path/nginx

    启动firefox 直接terminal敲firefox
    启动netbeans 直接termina敲 netbeans
    .
    .
    .

  7. Avatar
    lee over {{count}} years ago:

    启动服务和启动gui程序用的语句不一样!
    那设置自启动的时候,在terminal里敲程序的启动程序和在脚本里用那个nohup命令的效果是一样的?是这样吗?
    nohup 后面的是路径或者是系统已经识别的程序的名称 &
    是这样吗?

  8. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    加了nohup …. &
    就会以后台daemon运行了
    你可以


    >nohup firefox &

    试下

  9. Avatar
    lee over {{count}} years ago:

    0.0木有效果… 我就试一试自启动火狐!
    在/home/shell/autostart.sh里加入火狐的启动路径
    在~/.config/autostart/autostart.sh.desktop添加 autostart.sh的路径
    然后重启!嗯~木有效果!
    是不是我哪一步做错啦!
    system → prefences → start applications这个不用行不行?

  10. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    最好使用,我都是这么添加的
    你使用
    system → prefences → start applications

    这种方式添加你的shell文件,然后再重启下看看

  11. Avatar
    lee over {{count}} years ago:

    这个能不能不使用阿!
    因为我的另一台机子是服务器版。木有这个东西!

  12. Avatar
    wxianfeng over {{count}} years ago:

    @lee
    服务器怎么会用到图形界面的软件,纯命令行就ok了, 装的server版用的? 那装上x window 也应该有吧!!!

  13. Avatar
    lee over {{count}} years ago:

    那台机子是朋友丢过来的!说没办法自启动一个东东!
    能够进入界面!但是界面上什么都没有!
    我就奇怪它哪里弄来的机子。!
    那台机子要启动的东西是个触摸屏的软件!
    就是启动之后,它的触摸屏点击能够有效果。

  14. Avatar
    Passenger ships Ancona Patras over {{count}} years ago:

    This is very fascinating, You’re an excessively professional blogger.
    I hve joined your rss feed and look forward to seeking more of your wonderful
    post. Additionally, I’ve shared your website in my social networks

  15. Avatar
    Passenger ships Ancona Patras over {{count}} years ago:

    This is verty fascinating, You’re an excessively professional blogger.
    I have joined your rss feed and look forward to seeking more of your wonderful post.

    Additionally, I’ve shared your website in my social networks

Leave a comment