最近用influxdb做测试,Centos服务器只能连内网,用的rpm包本地安装的,安装完启动服务总是失败,但是前台运行是没有问题的。但是前台运行退出ssh登录时程序就停止运行了,所有就用了nohup这个命令了。。。
说明
前提:程序未对信号做特殊处理
nohup:no hang up,字面意思“不挂断”,就是说“SIGHUP”信号对我不好使收到该信号会忽略掉,但是“SIGINT”信号对我好使(ctrl+c)收到信号程序会退出
nohup program arguments
e.g.:nohup test_nohup -t 1
test_nohup:可运行程序
-t:程序参数
1:参数值
当然,程序可能没有参数...是的,这个不是关心的重点
一、图解说说【nohup】
相关:
打印进程信息:ps -ef | grep [要匹配的进程名] | grep -v [不显示匹配的字符串]
(1)用【nohup】启动程序
程序启动
启动程序,打印进程信息,进程号为3882,我们先不关心“appending output to nohup.out是什么东东~”
(2)发送中断信号
ctrl + c 中断
按ctrl + c中断程序(终端显示^C),再次打印进程信息,可以看到进程已经不在了,输入命令后显示空行~
(3)发送挂起信号
发送挂起消息
再次运行该程序,关闭窗口发送"SIGHUP"信号此次的session就结束了,程序收到该信号默认执行exit()退出。
打印进程,进程还在
此时要退出只能使用【kill】命令关掉该进程:
kill -9 进程号
-9:表示kill信号,无法抓取,无法忽略,意思是“城管来了,小摊儿必须撤”
kill后,进程不存在了
二、图解说说【&】
前台运行程序时,该程序会一直占用着终端如果有屏幕输出的话屏幕会一直打印,这时候我们让程序后台运行(可能会一直打印,但不会占用终端),在程序运行命令最后加上 【&]
(1)后台启动程序
后台启动
后台启动一个程序,进程号为“4386”,屏幕每隔2秒打印一个字符串,并且终端未被程序占用,并且多次使用“ctrl + c”程序并未中断退出
(2)发送挂起信号
发送SIGHUP
打印进程信息
关闭终端窗口,此次session关闭,程序退出后打印进程信息可以看到进程已经不在了
三、最终的组合【nohup】+【&】
命令组合:
nohup test_nohup -t 2 &
这样程序就可以在后台运行且关闭窗口也对其没有影响
(1)启动程序并关闭终端窗口
程序启动
打印进程
关闭这个集成依然还是使用【kill】命令
写在最后
后台运行,如果不想看到控制台打印日志可以:
./test_nohup -t 2 > ./back_ground.txt 2>&1 &
0:标注输入,1:标准输出,2:标准错误输出
输出重定向到文件
意思标准输出重定向到文件‘back_ground.txt’中,【2>&1】意思是将标准错误输出重定向到标准输出,因为标准错误输出是没有缓冲区的而标准输出有,并且如果实时输出到文件中要【flush】输出缓冲区,否则未达到缓冲区大小时是不会输出到文件的。
如果不需要输出文件,则可以:
./test_nohup -t 2 > /dev/null 2>&1 &
将所有输出重定向到【/dev/null】这个‘空’设备文件,它会丢弃写入的内容,就感觉任何东西都被“宇宙黑洞”吞噬了一样。。。
嗯,是的,你可以跟【nohup】组合。。。
like this...:nohup ./test_nohup -t 2 > /dev/null 2>&1 & ,这样关闭‘窗口’程序依然在后台运行