没有nohup,没有nousr1命令吗?


12

我的几个常规程序崩溃(定期),并显示消息“用户定义的信号1”。我知道有nohup命令,但是有nousr1命令吗?还是可以nohup用USR1 做类似的事情?


3
更好的问题可能是首先发送usr1信号的是什么?如果没有,退出消息可能只是误导。
2014年

2
听起来您的“常规程序”中可能有一些严重的问题……简单地禁用信号可能无法纠正或使基础应用程序正常运行。我强烈建议您在禁用某些功能之前仔细检查您的环境。
mdpc

@格兰特:我同意。是否有实用程序可以告诉我什么在发送这些信号?
user2624632

Answers:


3

一个简单的hacky解决方案,使该实用程序类似于nohup,但是对于SIGUSR1,将是获取coreutils源代码的副本,将其解压缩,然后执行

sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c

,还可以选择更改输出文件名

sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c

,请编译该源并将新编译的nohup二进制文件安装到/usr/bin/nousr1

cp /path/to/coreutils/src/nohup /usr/bin/nousr1

之后,如我所检查的,sleep 1000在上退出USR1,而不nousr1 sleep 1000受此信号的影响。


nohup顺便说一句,的主要功能是使流程与终端解除关联,这样它就不会SIGHUP首先发送。它还设置了一个信号处理程序是一个额外的好处,但是应该没有必要。
Simon Richter 2014年

@SimonRichter如果您删除signal(SIGHUP,SIG_IGN);呼叫nohup.c,则该过程将收到SIGHUP。什么nohup是忽略的信号确实一旁刚刚重新开放的标准输入,标准输出,标准错误描述符作为非终端文件。它实际上并没有以任何特殊方式将过程与终端解除关联。即,该过程将SIGHUP在终端挂断时发送。另一方面,bash与disown命令具有相似的功能,但是我不确定是如何实现的-可能是您的意思。
Ruslan 2014年

这似乎运作良好。
user2624632

8

shell trap内置命令怎么样?

trap 'echo "Thou shalt not USR1 me"' USR1 

好主意,但是没有用。无论如何,该过程都以“用户定义的信号1”退出。
user2624632

子进程不会继承信号处理程序(SIG_IGN和SIG_DFL除外)。
aecolley

2

您需要使用trap带有空白参数的命令形式。尝试这个:

trap '' SIGUSR1; myprogram

这将忽略您正在尝试执行的SIGUSR1信号。尽管我同意评论员的意见,但这里发生的事情可能比目睹的更多。

错误的形式:

trap 'echo ...' SIGUSR1; myprogram

仍将允许myprogram接收SIGUSR1,但外壳程序将随后echotrap命令中执行。


这似乎运作良好。
user2624632

糟糕,我讲得太早了。我在跑步trap '' SIGUSR1; gvimdiff file1 file2,Vim死于“ Vim:收到致命信号USR1”。
user2624632

嗯,在code.google.com/p/vim/source/browse/src/os_unix.c中查看源代码,似乎VIM重新启用了USR1信号并将其视为致命错误。您唯一的希望似乎是使操作系统拒绝传递USR1信号。我不知道是否有可以提供该功能的东西。
Adrian Pronk


阿德里安·普龙克(Adrian Pronk):不只是Vim;它也是Firefox,Aqualung,Thunderbird等。但不会永久运行其他应用程序,例如Konsole。
user2624632
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.