从.bashrc开始后台进程

时间:2012-06-16 18:21:21

标签: bash putty

我意识到这可能是一个愚蠢的问题,但即使挖掘了stackoverflow网站和google,我也无法解决数小时。

这是.bashrc中的基本代码,用于在我登录shell后启动gkrellm

if ps ax | grep -v grep | grep gkrellm > /dev/null
then
    echo "gkrellm is already running"
else
    command gkrellm &
fi

我已经习惯了尝试

...
else
    nohup gkrellm &
fi
...

...
else
    gkrellm
    $GK_PID=`pidof gkrellm`
    disown -h $GK_PID
fi
...

gkrellm被正确地作为后台作业,我可以使用shell(如预期的那样)。但是,即使我从同一个shell启动其他应用程序,一旦按下Ctrl-c,我仍然会退出gkrellm。如何阻止gkrellm在Ctrl-c上关闭?

以防万一。我正在使用名为KiTTY的PuTTY克隆,但​​相信这不是问题。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

使用 bash disown&>/dev/null
您需要在bg(gkrellm &)和disown

中运行该应用
if ps -C gkrellm -o user | grep "$LOGNAME" &>/dev/null 
then echo "gkrellm is already running"
else gkrellm & disown
fi

如果你想要更便携并且使用 posix sh
您需要使用nohupcoreutils和POSIX的一部分)
还有背景(nohup cmd &
您还可以使用 .profile 代替 .bashrc

if ps -C gkrellm -o user | grep "$LOGNAME" 2>/dev/null 1>&2
then echo "gkrellm is already running"
else nohup gkrellm &
fi

其他方法包括 - 正如@Pontus所回答 - 使用dtachscreentmux等工具,其中命令在分离的环境中执行。

  

由Pontus
  使用窗口管理器的自动启动功能会更有意义

确实:)因为afaik gkrellm是一个GUI应用程序,最好自动启动它,使用 .xinitrc (如果您的登录管理器支持它),或者您的窗口经理的自动启动设施。

答案 1 :(得分:1)

尝试替换“nohup gkrellm&”有了这个:

screen -S gkrellm -d -U -m gkrellm

这将启动运行gkrellm的分离屏幕会话,它不会关心当前的shell会话。我不确定从.bashrc启动是否是最佳解决方案,使用窗口管理器的自动启动功能更有意义。

编辑:不确定我是否正确阅读了问题,您是否使用KiTTY连接到Linux主机并通过X转发远程运行gkrell?如果是这种情况,您显然无法使用窗口管理器功能。 :)

答案 2 :(得分:1)

几乎忘记了这个问题并在很久以前找到了一个有效的解决方案后回答了我自己的问题;)多年来我的.bashrc中的作品很棒

mygkrellm()
{
    if pidof -x "gkrellm" >/dev/null; then
    echo "Gkrellm is already running. Go to shell!"       
    else
    nohup "/usr/bin/gkrellm" &
    fi
}