我意识到这可能是一个愚蠢的问题,但即使挖掘了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克隆,但相信这不是问题。
感谢您的帮助!
答案 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
您需要使用nohup
(coreutils
和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所回答 - 使用dtach
,screen
或tmux
等工具,其中命令在分离的环境中执行。
由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
}