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

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

我不知道这是否属于 SO(因为它是一个编码错误)但我认为你们会对所用软件的细微差别有更多的了解(所以甚至可以考虑 U&L)。

这是最小的代码脚本(请参阅编辑以获取完整脚本,我这样做是有原因的);

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

它试图在后台运行一个服务器,该服务器输出到日志文件。
然后我follow使用该日志文件less +F。正如你所做的那样,要退出它,你必须先按ctrl+ c,然后才能按Q

发生的事情是,当我在命令(停止)中ctrl按 +时,它会以某种方式终止从顶部启动的服务器!其他任何事情都不会受到影响。我可以按 +再次开始跟踪日志(由于服务器被终止,因此不会获得任何新信息),如果我按 + ,脚本的其余部分将正常执行。clesstailingnohupshiftfQ

您知道为什么会发生这种情况吗?如何避免这种情况/我应该使用其他方法吗?


PS
服务器程序可能正在监听^C,这可能是问题所在;我能做些什么来阻止它吗?例如,当我自己运行它{SERVERCOMMAND}(以阻塞方式)时,我可以按ctrl+ c,这不会立即杀死它;它会打印Received ^C signal, shutting down(然后自杀)。这就是我^C进入时发生的事情less(将 finalReceived ^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 &
    
  • 用来stty intr ^G替换中断命令,但随后ctrl+g所做的正是^C所做的事情(因此这可能是我的终端仿真器的问题;konsole

  • nohup&/或less行放在括号中(使其成为子 shell)

  • 运行脚本xterm而不是konsole

答案1

当+时,我正确地想到它会SIGINT被发送到所有进程,但是我愚蠢地认为创建另一个进程会将它带出(请参阅中的我的尝试)。ctrlcprocess groupP.P.S.

不仅是确切的用例,而且是正确的解决方案。

由于我的脚本的结构,那里的答案并不逐字逐句地适合,这是现在的脚本;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

ctrlI + cin之后服务器继续输出到日志文件less

感谢大家的时间。

答案2

你有没有尝试过否认

  disown -h %1

无论你的工作是什么;否认是一个内置的 shell,它的手册页状态:

否认

放弃 [-ar] [-h] [jobspec ...]

如果没有选项,则每个 jobspec 都会从活动作业表中删除。如果-h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a' 或-r' option is supplied, the current job is used. If no jobspec is supplied, the-a' 选项表示删除或标记所有作业;没有 jobspec 参数的 `-r' 选项会将操作限制为正在运行的作业。

编辑

有趣的是,你的构造可以在我的 Arch Linux 上运行:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to ‘nohup.out’
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

之前附言命令,我必须滚动 out.log 文件,然后Ctrl+C,然后q

相关内容