nohup命令

简言

1. nohup 是 no hang up 的缩写,就是不挂断的意思,用来忽略SIGHUP信号

2. 连接服务器的终端退出时,这个终端启动的所有进程都会收到系统发出的SIGHUP信号,进程的默认处理是关闭自己

3. 如果在启动进程时加上了nohup命令,终端退出时,通过该终端启动的进程仍然会收到SIGHUP信号,但是会多出一个默认处理,那就是忽略SIGHUP信号,不再关闭自己

4. 如果在启动进程时加上了nohup命令,同时进程的程序中也添加了SIGHUP信号的捕获,那么当进程收到该信号时就不会再默认关闭自己了,至于如何处理完全看程序怎么写

总结

启动进程时加了nohup,并不是不会产生SIGHUP信号,而是多了一个默认处理,即不再关闭进程

如果你在进程的程序中添加了对SIGHUP信号的捕获,那么默认的不关闭进程处理会变成你程序中的处理

实验如下

第一步(登录终端连接进服务器,nohup go run main3.go & 启动进程,确保进程开起来了,然后退出终端,退出终端后系统会发出SIGHUP信号给该进程)

第二步(再登录终端连接进服务器,可以看到进程捕获到了SIGHUP信号,开始后面的循环,进程依然存在)

代码如下


package main

import (
	"io"
	"os"
	"os/signal"
	"strconv"
	"time"
)

func main() {
	// 监控所有系统信号
	osc := make(chan os.Signal, 1)
	signal.Notify(osc)
	s := <- osc

	// 若能捕获到信号,就把时间,信号名字写入一个本地文件
	fileName :=time.Now().Unix()
	f,_:= os.Create(strconv.Itoa(int(fileName)))
	timeStr := time.Now().Format("2006-01-02 15:04:05")
	io.WriteString(f,timeStr)   // 时间写入文件
	io.WriteString(f,"\n")      // 换行
	io.WriteString(f,s.String())// 信号写入文件
	io.WriteString(f,"\n")      // 换行
	defer f.Close()

	// 依然不退出,每隔3秒写入一次当前时间
	for {
		time.Sleep(time.Second*3)
		timeStr := time.Now().Format("2006-01-02 15:04:05")
		io.WriteString(f,timeStr)   // 时间戳写入文件
		io.WriteString(f,"\n")    // 换行
	}
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值