2011年10月16日星期日

ubuntu下goagent开机自启动

GoAgent的安装和部署可以参考一篇旧文。下面讨论的是如何开机运行GoAgent。

Windows下是没有这种烦恼的(吐槽:linux下其实也没烦恼,“庸人”自扰而已),只需将proxy.exe加入开机启动项即可。在Ubuntu上,每次需要执行python proxy.py才可以运行goagent,而且需要一直开着终端,着实有点不太方便。要实现开机启动GoAgent,可以在 ~/.profile (如果没有该文件,自己创建)中添加以下语句:

# goagent
cd /usr/local/phus-goagent-b1f5004/local
python proxy.py > /dev/null 2>&1 &
cd ~

/usr/local/phus-goagent-b1f5004是我解压goagent的目录。

有几个问题需要交代一下:
  1. nohup

    当我刚开始尝试开机启动GoAgent时,使用的方法是在~/.bash_login(Ubuntu默认没有该文件,自己创建的)中添加 python /usr/local/phus-goagent-b1f5004/local/proxy.py, 显然失败了。这其实有两个问题,一个问题下面会介绍,另一个问题就是没有使用nohup,使得当终端关闭时,程序也就结束了。

    nohup的作用就在于忽略所有挂断(SIGHUP)信号,在shell注销后保持程序继续运行。它会把输出重定向到nohup.out的一个文件中,保存在当前目录下,如果无法在当前目录下创建文件,则会保存在HOME/nohup.out。但是`nohup' does not automatically put the command it runs in the background; you must do that explicitly, by ending the command line with an `&'.",所以通常都需要在nohup后使用&。

    在上面的例子中,我把输出和err输出都重定向到/dev/null,这样就免得生成nohup.out文件。

    Update:
    很不幸地发现,不使用nohup也是完全可以正常使用的(吐槽:之前多么无知无畏阿),但上面关于nohup的介绍是没有任何问题的。提醒一点,即便没有使用nohup, 命令后添加&使得程序运行在后台,还是不能省略的。

  2. /etc/profile .bash_profile .bash_login .profile
    我开始尝试失败的另一个原因就是把命令写在了一个错误的地方~/.bash_login。其实当以图形界面登陆时,并没有读取.bash_login文件,使得命令根本没有运行。shell的初始化文件不同情景下读取顺序情况如下:

    1. 图形模式登录时,顺序读取:/etc/profile和~/.profile
    2. 图形模式登录后,打开终端时,顺序读取:/etc/bash.bashrc和~/.bashrc
    3. 文本模式登录时,顺序读取:/etc/bash.bashrc,/etc/profile和~/.bash_profile
    4. 从其它用户su到该用户,则分两种情况:
    (1)如果带-l参数(或-参数,--login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/bash.bashrc,/etc/profile和~ /.bash_profile。
    (2)如果没有带-l参数,则bash是non-login的,它将顺序读取:/etc/bash.bashrc和~/.bashrc
    5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout
    6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile和~/.bash_profile,若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh(这个不属于bash shell),则不会读取上面的任何文件。
    7. 上述原则凡是读取到~/.bash_profile的,若该文件不存在,则读取~/.bash_login,若前两者不存在,读取~ /.profile。

    更详细的讨论可以前往这里参考一下。

参考资料

[1]nohup MAN Page
[2]shell的初始化文件
[2]Ubuntu开机自动启动GAppProxy

2 条评论:

  1. 喔草,终于成功了,~/.profile误理解为根目录下的profile

    回复删除