..

记一次服务部署失败

最有golang服务部署一直失败,服务被启动起来以后,打印了两行启动日志,然后立马就自动退出了,没有panic日志,而且在老版本的部署系统上部署是没有这个问题的。而且吧部署系统的使用的命令行复制出来,直接在服务器上执行,进程也能正常启动,并且退出登录以后,程序也不会挂掉,所以我确认我的启动方式是没有问题的,之前那么多的golang服务启动也没有问题,后来下载代码下来看发现代码。这个golang服务监听了SIGHUP信号,收到这个号信号以后程序会调用os.Exit(1)自动退出,然后我用老版本的部署系统启动进程,手动给这个进程发送SIGHUP信号,果然程序自动退出了。于是我想起来了,通知相关的开发人员收到这个信号以后忽略掉。再次部署,一气呵成。事情还没有完,因为我想到了之前部署node服务的时候也发生了这样的问题,一直没有找到原因,不得已放弃nohup的形式,改用pm2来管理进程,所以我怀疑node是不是默认监听了SIGHUP型号,并且收到型号以后自动退出。于是我验证了下,手写了最简单的服务,手动启动,发送SIGHUP型号,果然程序退出了。那么手动忽略这个型号是不是就ok了呢

var http = require('http');  
  
var hostname = '127.0.0.1';  
var port = 3000;  
var server = http.createServer(function(req, res) {    
    res.statusCode = 200;  
    res.setHeader('Content-Type', 'text/html');  
    res.write('<head><meta charset="utf-8"/></head>');  

    var htmlDiv = '<div style="width: 200px;height: 200px;background-color: #f0f;">div</div>';  
    res.write('<b>亲爱的,你慢慢飞,小心前面带刺的玫瑰...</b>');  
    res.write(htmlDiv);  

    res.end('<h1>Hello world!</h1>');  
});  
process.on('SIGHUP', (err) => {
    console.info(err)
  });
server.listen(port, hostname, function() {  
    console.log('Server running at http://%s:%s', hostname, port);  
});  
jukay@localhost ~/C/W/blog(20.5)> lsof -i:3000                                                                                                        五  3/16 17:21:20 2018
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    85016 jukay   13u  IPv4 0xd088754a58137eaf      0t0  TCP localhost:hbci (LISTEN)
jukay@localhost ~/C/W/blog(20.5)> kill -1 85016
jukay@localhost ~/C/N/hanup(20.5)> node main.js                                                                                        15.2s  五  3/16 17:05:49 2018
Server running at http://127.0.0.1:3000
SIGHUP

果然,收到了SIGHUP,这回没有自动退出。这里我还是有一个问题没有明白:Ansible执行部署脚本退出后为什么会发送SIGHUP型号的,手动执行命令,退出terminal就没有发送信号。