5

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

这是 .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 克隆,但相信这不是问题。

感谢帮助!

4

3 回答 3

2

在很久以前找到一个可行的解决方案后几乎忘记了这个问题并回答了我自己的问题;)多年来,Follow 在我的 .bashrc 中效果很好

mygkrellm()
{
    if pidof -x "gkrellm" >/dev/null; then
    echo "Gkrellm is already running. Go to shell!"       
    else
    nohup "/usr/bin/gkrellm" &
    fi
}
于 2016-01-09T09:33:16.087 回答
1

使用bash ( disownand &>/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
,您将需要使用nohupcoreutilsPOSIX 的一部分)
以及背景它(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 回答的那样 - 使用或等工具dtach,其中命令在分离的环境中执行。screentmux

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

确实:) 因为 afaikgkrellm是一个 GUI 应用程序,所以最好使用.xinitrc(如果您的登录管理器支持它)或您的窗口管理器的自动启动工具来自动启动它。

于 2012-06-16T23:29:53.580 回答
1

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

screen -S gkrellm -d -U -m gkrellm

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

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

于 2012-06-16T20:27:56.463 回答