子进程中的 Ctrl+c 正在终止脚本中较早的 nohup 进程

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+cless命令中(停止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

我认为它SIGINTctrl+时被发送到所有进程是正确的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

谢谢大家的时间。