在POSIX OS下,有一个信号API,它允许发送一个信号进行处理以使用kill来关闭它,你可以用sigaction捕获它并做你需要的事情;
但是,Win32不是POSIX系统,因此:
我不是在谈论GUI,我在谈论应该很好地关闭的TCP/IP服务器.这不像Windows服务那样运行.
在Node.js服务器中,捕获SIGTERM与捕获SIGINT之间有什么区别吗?
我认为进程不应该能够阻止SIGINT的关闭?
process.once('SIGINT', function (code) {
console.log('SIGINT received...');
server.close();
});
// vs.
process.once('SIGTERM', function (code) {
console.log('SIGTERM received...');
server.close();
});
Run Code Online (Sandbox Code Playgroud)
我能够捕获两个信号并阻止退出吗?我的实验表明答案是肯定的,但从我读过的内容来看,SIGINT总是假设关闭一个进程.
或者我可能会把SIGINT与SIGKILL混淆?也许SIGKILL是我无法恢复的信号?
捕获这些信号当然可以让我优雅地关闭:
server.once('close', function(){
// do some other stuff
process.exit(2); // or whatever code pertains
});
Run Code Online (Sandbox Code Playgroud)
我想SIGINT与SIGKILL混淆了 -
如果我尝试这样做:
process.once('SIGKILL', function (code) {
console.log('SIGKILL received...');
exitCode = code || 2;
server.close();
});
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
internal/process.js:206
throw errnoException(err, 'uv_signal_start');
^
Error: uv_signal_start EINVAL
at exports._errnoException (util.js:1022:11)
at process.<anonymous> (internal/process.js:206:15)
at emitTwo (events.js:106:13)
at process.emit (events.js:191:7)
at _addListener (events.js:226:14)
at process.addListener (events.js:275:10) …Run Code Online (Sandbox Code Playgroud) 我一直在新的xcode4上工作这个iPhone应用程序.实际上每次我在模拟器中退出我的应用程序时,我在main.m中的代码行上出现错误这是我的代码行,然后是下一行的错误
int retVal = UIApplicationMain(argc,argv,nil,nil);
线程1:编程接收信号:"SIGTERM".
这里发生了什么?我该如何解决?
可以使用 终止实际的 HTTP 服务器实例server.close(callback),但我不确定任何挂起的 WebSocket 操作(通过 WebSocket 运行的突变或查询)会发生什么。由于 http.Server 对 WebSocket 操作一无所知,它可能会忽略它们。如何正确确保当收到 SIGTERM 时,服务器停止接受新请求/webSocket 连接,完成挂起的连接然后关闭?
用谷歌找不到任何关于此的信息。
如果我SIGTERM使用该kill命令向进程发送信号,我期望退出代码,但在终止进程后运行以下命令时总是得到0(零):
echo $?
Run Code Online (Sandbox Code Playgroud)
根据这篇文章中的答案,我在发送SIGTERM一个进程时应该得到143 :始终应用Java结束"退出143"Ubuntu
但我没有得到退出代码.为什么?
Heroku可能出于各种原因向您的应用程序发送SIGTERM,因此我创建了一个处理程序来处理一些清理,以防万一.一些谷歌搜索没有得到任何关于如何在RSpec中测试这个的答案或例子.这是基本代码:
Signal.trap('TERM') do
cleanup
end
def cleanup
puts "doing some cleanup stuff"
...
exit
end
Run Code Online (Sandbox Code Playgroud)
测试程序收到SIGTERM时调用此清理方法的最佳方法是什么?
所以我在Heroku上有一个相当简单的设置.我正在使用RabbitMQ来处理后台工作.我的设置包含一个每天使用Heroku Scheduler插件运行的节点脚本.脚本将作业添加到队列中,工作者依次使用它们并将它们委托给单独的模块进行处理.
在我重新启动实例之前收到Heroku不时随机启动的SIGTERM事件后,问题就开始了.
出于某种原因,在重新启动实例后,工作人员永远不会再次恢复.只有当我手动重新启动它通过执行heroku ps:scale worker=0和heroku ps:scale worker=1工人继续消耗暂挂作业.
这是我的工人:
// worker.js
var throng = require('throng');
var jackrabbit = require('jackrabbit');
var logger = require('logfmt');
var syncService = require('./syncService');
var start = function () {
var queue = jackrabbit(process.env.RABBITMQ_BIGWIG_RX_URL || 'amqp://localhost');
logger.log({type: 'msg', msg: 'start', service: 'worker'});
queue
.default()
.on('drain', onDrain)
.queue({name: 'syncUsers'})
.consume(onMessage)
function onMessage(data, ack, nack) {
var promise;
switch (data.type) {
case 'updateUser':
promise = …Run Code Online (Sandbox Code Playgroud) 在发送SIGKILL之前,我试图弄清楚在接收SIGTERM时应用程序退出了多少时间?
我对这些信号的了解非常少.我已经在Stackoverflow的建议答案中阅读了一些内容,但我无法一瞥"大约"过程在SIGTERminated之前可以存活多长时间.
编辑:比方说我创建了一个故意阻止操作系统关闭的问题(也许是while(1)可以做到的?)
我正在寻找一个没有MMI的进程的答案,在一个标准的Linux发行版上,比如一个内核3.x的Ubuntu.
我的猜测是没有等待时间.如果该过程消失,系统会给它时间来释放其资源.否则,系统会杀死它.
我正在尝试在具有6GB RAM的Centos 6 VM上安装SonarQube。该过程始终以143退出。
经过分析,我发现JVM正在发送SIGTERM信号并因此退出。没有核心转储,并且dmesg也完全没有帮助。我也尝试摆弄内存选项无济于事。
如果有人可以帮助我调试此问题,它将非常有用。至少,我会对为什么终止该软件有所了解。
jvm 1 | 2018.03.06 15:32:59 INFO app[][o.e.p.PluginsService] no modules loaded
jvm 1 | 2018.03.06 15:32:59 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
jvm 1 | 2018.03.06 15:33:07 INFO app[][o.s.a.SchedulerImpl] Process[es] is up
jvm 1 | 2018.03.06 15:33:07 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/home/sonar/sonar/sonarqube-7.0]: /opt/jdk1.8.0_161/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/home/sonar/sonar/sonarqube-7.0/temp -Xrs -Xmx4g -Xms4g -XX:+HeapDumpOnOutOfMemoryError -cp ./lib/common/*:./lib/server/*:/home/sonar/sonar/sonarqube-7.0/lib/jdbc/mysql/mysql-connector-java-5.1.42.jar org.sonar.server.app.WebServer /home/sonar/sonar/sonarqube-7.0/temp/sq-process3024208901604150849properties
jvm 1 | 2018.03.06 15:33:12 INFO app[][o.s.a.SchedulerImpl] Process [web] is stopped
jvm 1 | 2018.03.06 15:33:12 INFO app[][o.s.a.SchedulerImpl] Process …Run Code Online (Sandbox Code Playgroud) 我想编写一个shell脚本,在后台生成几个长时间运行的进程,然后挂起.收到SIGTERM后,我希望所有子进程也终止.
基本上,我想要一个"主过程".
这是我到目前为止所得到的:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
# supposedly this should kill the child processes on SIGTERM.
trap "kill $PID1 $PID2" SIGTERM
wait
Run Code Online (Sandbox Code Playgroud)
上面的脚本失败了trap: 10: SIGTERM: bad trap.
编辑:我正在使用Ubuntu 9.04