子进程中的Ctrl + c会在脚本的前面杀死一个nohup'ed进程


15

我不知道这是否属于SO(因为它是一个编码错误),但我想你们会更了解所用软件的精妙之处(因此甚至可以考虑U&L)。

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

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

less +F currentOutput.log

它试图做的是在后台运行服务器,该服务器输出到日志文件。
然后我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
我一直在尝试许多事情(无济于事);

  • 尝试通过更改从脚本断开标准输入

    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行放在括号中(使其成为子外壳)

  • 运行脚本xterm而不是konsole


可能有人遇到了我的问题;I think it is due to the handling within the database software, not on the shell。程序将如何执行此操作?那我该如何停止呢?
Hashbrown 2014年

3
nohup阻止进程接收SIGHUP信号,而CTRL + C发送SIGINT信号。这就是为什么nohup没有您期望的效果。
Piotr Dobrogost,2015年

Answers:


11

我认为SIGINTctrl+ 时将其发送到所有进程是正确的c,但是我认为进行另一个进程会将其带到之外是愚蠢的process group(请参阅参考资料中的尝试P.P.S.)。

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

由于我的脚本是如何构造的,所以答案并不适合逐字记录,这就是现在的脚本。

#/bin/bash

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

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

感谢大家的时间。


0

您尝试过放弃吗?

  disown -h %1

或您的工作是什么;disown是内置的shell,其手册页指出:

舍弃

放弃[-ar] [-h] [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]
  $

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


是的,但是我不知道如何应用它。我尝试将nohup行放置在一个函数中,该函数disowns本身应与相同nohup。我不认为这是一个SIGHUP问题,因为当我删除该less行时,脚本在服务器仍在运行的情况下结束
Hashbrown 2014年

@Hashbrown pls请参阅我的编辑
MariusMatutiae 2014年

是的,我也做了一个测试,调用了一个简单的bash脚本而不是{SERVER}可执行文件。而且nohup运作良好。看到我对这个问题的评论。我认为这是有目的地听的。由于它是一台适当的服务器(并且不为人所知),我什至无法说出它是什么,因此有人可以“哦,它在做X,您需要在做Y”
Hashbrown 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.