Has*_*own 17 linux bash nohup less
我不知道这是否属于 SO(因为它是一个编码错误),但我认为你们会更了解所用软件的微妙之处(因此甚至可以考虑 U&L)。
这是最小的代码脚本(请参阅完整脚本的编辑,我这样做是有原因的);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Run Code Online (Sandbox Code Playgroud)
它试图做的是在后台运行一个服务器,它输出到一个日志文件。
然后我follow使用less +F. 与您一样,要退出此操作,您必须先按ctrl+c才能按Q。
发生的事情是,当我ctrl+c在less命令中(停止tailing)时,它会以某种方式杀死nohup从顶部开始的服务器!其他没有任何影响。我可以shift+f再次开始拖尾日志(由于服务器被终止,因此不会获得新信息),如果我点击Q脚本的其余部分,则脚本的其余部分将正常执行。
你知道为什么会这样吗?如何避免它/我应该使用的其他东西?
PS
服务器程序可能正在侦听^C,这可能是问题所在;我能做些什么来阻止它吗?就像,当我{SERVERCOMMAND}自己运行(以阻塞方式)时,我可以点击ctrl+ c,这不会立即杀死它;它打印Received ^C signal, shutting down(然后杀死自己)。这就是当我^C进入时发生的事情less(决赛Received ^C signal, shutting down被写入日志)。
PPS
我一直在尝试很多东西(都没有成功);
尝试通过更改将 stdin 与脚本断开连接
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
to
nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
or
nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)使用stty intr ^G替换中断命令,但随后ctrl+g也正是^C在做什么呢(所以这可能是与我的终端仿真器的问题,而不是; konsole)
将nohup&/或该less行放在括号中(使其成为子外壳)
运行脚本xterm而不是konsole
Has*_*own 14
我认为它SIGINT在ctrl+时被发送到所有进程是正确的c,但是我愚蠢地认为制作另一个进程会将它带到外面process group(请参阅我在 中的尝试P.P.S.)。
这不仅是确切的用例,而且是正确的解决方案。
由于我的脚本的结构方式,那里的答案不适合逐字逐句,这是现在的脚本;
#/bin/bash
setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Run Code Online (Sandbox Code Playgroud)
服务器在 I ctrl+ cin后继续输出到日志文件less。
谢谢大家的时间。