bundle exec thin start -p 3111 给出以下输出:
使用机架适配器瘦Web服务器(v1.2.11代号Bat-Shit Crazy)最大连接数设置为1024听取0.0.0.0:3111,CTRL + C停止^ C
Ctrl-C不执行任何操作(SIGINT).也没有杀死(SIGTERM).
我发现了一些这种行为的引用,但没有解决方案.问题似乎是在eventmachine(捆绑了最新的thin),ruby 1.9.2-r290或linux内核(Ubuntu 10.4 LTS,2.6.38.3-linode32)中.
它发生在我的项目中,但不是一个全新的rails项目.
参考文献:
根据pcntl_wait的 PHP 文档,
等待函数暂停当前进程的执行,直到子进程退出,或者直到传递了一个信号,其动作是终止当前进程或调用信号处理函数。
但是,当我运行以下代码并使用kill -s SIGTERM [pid]信号处理程序将 SIGTERM 发送到父进程时,仅在子进程退出后才调用(即我必须等待睡眠完成。不pcntl_wait()应该被 SIGTERM 中断吗?
fork_test.php:
<?php
declare(ticks = 1);
function sig_handler($signo) {
switch ($signo) {
case SIGTERM:
echo 'SIGTERM' . PHP_EOL;
break;
default:
}
}
pcntl_signal(SIGTERM, 'sig_handler');
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
}
else if ($pid) {
echo 'parent' . PHP_EOL;
pcntl_wait($status);
}
else {
echo 'child' . PHP_EOL;
sleep(30);
}
?>
Run Code Online (Sandbox Code Playgroud)
输出(SIGTERM 仅在等待 30 秒后出现):
$ php …Run Code Online (Sandbox Code Playgroud) 我有一个单线程进程,它不会因 kill -TERM 而死亡。进程信号掩码没有显示 SIGTERM 被阻塞。我正在以 root 身份执行 'kill'。我可以使用 SIGKILL 终止进程,但这是更大系统的一部分,我希望 SIGTERM 能够工作。
$ cat /proc/5105/status
Name: task_root.nginx
State: S (sleeping)
Tgid: 5105
Pid: 5105
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 109 124 1000
VmPeak: 3304480 kB
VmSize: 3304472 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 249060 kB
VmRSS: 320 kB
VmData: 3228468 kB
VmStk: 1012 kB
VmExe: 3020 kB
VmLib: 30232 kB …Run Code Online (Sandbox Code Playgroud) 在 bash 中,我可以捕获SIGINT、SIGKILL、SIGTERM等。这使我可以根据程序意外停止的方式做不同的事情。
有没有办法在R中做到这一点?
我正在运行一个包含24台服务器的hadoop集群.它已运行了几个月,但在最后一次重启后,数据节点仍然因错误而死机:
2016-02-05 11:35:56,615 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /192.168.0.133:50010, dest: /192.168.0.133:40786, bytes: 118143861, op: HDFS_READ, cliID: DFSClient_attempt_1454667838939_0001_m_000330_0_-1595784897_1, offset: 0, srvID: 6522904d-0698-4794-af45-613a0492753c, blockid: BP-2025286576-192.168.0.93-1414492170010:blk_1076219758_2486790, duration: 21719288540
2016-02-05 11:35:56,755 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /192.168.0.133:50010, dest: /192.168.0.133:40784, bytes: 118297616, op: HDFS_READ, cliID: DFSClient_attempt_1454667838939_0001_m_000231_0_-1089799971_1, offset: 0, srvID: 6522904d-0698-4794-af45-613a0492753c, blockid: BP-2025286576-192.168.0.93-1414492170010:blk_1076221376_2488408, duration: 22149605332
2016-02-05 11:35:56,837 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /192.168.0.133:50010, dest: /192.168.0.133:40780, bytes: 118345914, op: HDFS_READ, cliID: DFSClient_attempt_1454667838939_0001_m_000208_0_-2005378882_1, offset: 0, srvID: 6522904d-0698-4794-af45-613a0492753c, blockid: BP-2025286576-192.168.0.93-1414492170010:blk_1076231364_2498422, duration: 22460210591
2016-02-05 11:35:57,359 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /192.168.0.133:50010, dest: /192.168.0.133:40781, bytes: 118419792, op: HDFS_READ, cliID: …Run Code Online (Sandbox Code Playgroud) 我的package.json脚本部分看起来像这样。
"scripts": {
"prestart": "mongod",
"start": "NODE_ENV=prod node server.js",
"poststop": "mongo admin --eval 'db.shutdownServer()'",
"predev": "mongod",
"dev": "NODE_ENV=dev nodemon server.js"
},
Run Code Online (Sandbox Code Playgroud)
我使用 pre- 和 post 钩子mongod在启动我的服务器之前启动。然后我使用ctrl+杀死我的服务器c。不幸的是,这不会执行poststop脚本。结果,npm/yarn start/dev第二次调用会抛出错误并中止,因为mongod已经在运行。
另一个 mongod 实例已经在 /data/db 目录上运行,正在终止
我可以以某种方式实现poststop在ctrl+ c?
我使用上下文管理器流式传输数据以在程序退出时关闭连接。我在后台将我的程序作为守护进程运行。
当守护进程被 SIGINT 或 SIGTERM 或 kill 命令发送的任何中断信号中断时,如何让上下文管理器处理这种情况?
我在 Raspberry Pi 和 Ubuntu 上运行 Python 3。
我已经看到了:如何在 Python 中捕获 SIGINT? 这很有帮助,但我不确定如何将它与 python 的上下文管理器一起使用?IE。假设我有一个作为上下文管理器构建的对象:
class Sensor:
def __init__(self, name: str):
self.name = name
def __enter__(self):
self._connect()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
Run Code Online (Sandbox Code Playgroud)
我在作为守护程序运行的脚本中使用该对象。是否有一种 pythonic 方法来指定 __ exit__ 函数也必须在 SIGINT 和 SIGTERM 异常上调用?
对不起,如果没有正确理解异常和信号中断在 python 中是如何工作的,我的问题没有意义
我在 Linux 上有一个进程,它通过 fork 启动 20 个子进程。当我杀死父进程时,它通常会杀死所有子进程,但有时它不会杀死所有子进程,并且会留下一些孤立进程。这不是启动时的竞争条件,这是在进程处于活动状态几分钟之后。
什么样的事情会导致 SIGTERM 无法正确传播到某些子进程?
我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序。发送的信号是SIGTERM。我使用新的PosixSignalRegistration.Create()方法实现了 Posix Sgnal Handler 。当在调试模式下编译时,这可以完美地工作。但是,在发布模式(打开优化)下,永远不会进入处理程序。
这是一个 MRE:
using Microsoft.Extensions.Hosting;
using System.Runtime.InteropServices;
ManualResetEvent resetEvent = new(false);
CancellationTokenSource cts = new();
// Handles CTRL + C in both operating systems
Console.CancelKeyPress += (sender, eventArgs) =>
{
Console.WriteLine("Received CTRL+C");
resetEvent.Set();
eventArgs.Cancel = true;
cts.Cancel();
};
// Handles graceful kill (Sigterm) in linux (e.g. systemctl stop)
PosixSignalRegistration.Create(PosixSignal.SIGTERM, (context) =>
{
Console.WriteLine("Received SIGTERM");
resetEvent.Set();
cts.Cancel();
});
IHost? host = null;
try
{
var hostBuilder = Host.CreateDefaultBuilder(args);
host = …Run Code Online (Sandbox Code Playgroud) 有没有办法 sigterm 超时的进程?如果该进程没有在 30 分钟内正常终止,则该进程应该得到 sigkill。理想情况下,这种正常关闭应该在后台执行。