Linux下的守护进程

这两天在搭建VNC服务的时候,遇到一个简单的问题,却困扰了我有一会:网上的教程大部分是修改.service文件,然后启动服务,但是我发现使用vncserver这个命令也可以达到同样的目的,这两者之间有什么区别呢?查了一些资料,简单的做一个总结。

工作管理

一般情况下,我们可能会在命令行下这样启动一个程序,以新做的版本管理系统为例:

java -jar VersionManager.jar

现在,内网中的其他机器可以通过80端口访问本机提供的web服务了。一切都很正常。

注意到一个问题,新启动的程序独占了命令行窗口,并随时打印一些程序运行期间的log出来。
如果想在同一个命令行窗口再执行其他命令,那么需要Ctrl+c停止这个web服务才可以。

这个时候的web服务称为前台任务,一旦我们退出这个命令行窗口,该服务也随之关闭,无法访问。

如何将其变成一个后台执行的任务,从而不影响命令行再执行其他命令呢?

java -jar VersionManager.jar &

只要在命令的尾部加上符号&,启动的进程就会成为"后台任务"。"后台任务"有两个特点:

  1. 继承当前 session (对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。

  2. 不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。

所以,我们以上述方式启动web服务,他的运行日志依然会打印在屏幕上面。但是与前台任务的一个区别就是,现在可以在命令行执行其他命令了,所有的输出都会混杂在一起打印在屏幕上。

有没有办法解决这种问题呢?那就是重定向:

java -jar VersionManager.jar >info.log 2>&1 &

上述命令把web服务输出的标准输出和标准错误信息都重定向到了info.log这个文件,屏幕上不会再有任何的信息被打印出来了。你也可以像之前那样查看web服务的输出信息:

tail -f info.log

此时,web服务的输出又动态的在屏幕上打印出来了。

如果要让正在运行的"前台任务"变为"后台任务",可以先按ctrl + z,然后执行bg命令。(让最近一个暂停的"后台任务"继续执行)

如何查看当前session有哪些后台任务在运行呢?

$ jobs -l //打印pid
[1]- 17000 运行中               nohup java -jar VersionManager.jar > logs/info.log 2>&1 &
[2]+ 22738 停止                  vim cron.log

将指定的后台任务变成前台执行:

fg 2 //继续编辑cron.log

最后做一个小结:

查看后台任务:jobs -l
将后台任务取回前台:fg number //number为任务号
暂停前台任务,并将任务放到后台:ctrl + z
暂停的后台任务继续执行:bg number //number为任务号
结束前台任务:ctrl + c
结束后台任务:kill pid //pid可以通过jobs -l进行查看

脱机管理

通过上面的内容,我们了解到如何将一个任务放在后台执行。后台任务都是基于当前session的,如果我们退出了当前的session(关闭了命令行窗口或执行exit),后台任务还会执行吗?

想起了之前有个现场的技术支持人员打电话跟我反映,一个rest服务总是无规律的宕掉。刚开始我也想不通,后来才想到是上面提到的原因...

看一下session退出的时候发生了什么:

  1. 用户准备退出 session

  2. 系统向该 session 发出SIGHUP信号

  3. session 将SIGHUP信号发给所有子进程

  4. 子进程收到SIGHUP信号后,自动退出

上面的流程可以解释,随着session退出,前台任务也会结束。那么后台任务是否也会收到SIGHUP信号后退出呢?

这由 Shell 的huponexit参数决定的。

shopt | grep huponexit

执行上面的命令,就会看到huponexit参数的值。如果显示off,表示session 退出的时候,不会把SIGHUP信号发给"后台任务",从而"后台任务"不会随着 session 一起退出。

但是,为了确保我们的web服务变成一个可靠的守护进程,我们应该显式的指出 session 退出的时候,不把SIGHUP信号发给"后台任务":

nohup

nohup java -jar VersionManager.jar &

nohupjava -jar VersionManager.jar命令做了几件事:

  • 阻止SIGHUP信号发到这个进程。

  • 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。

  • 重定向标准输出和标准错误到文件nohup.out。

一般情况下,我们会重定向web服务的输出:

nohup java -jar VersionManager.jar >info.log 2>&1 &

至此,我们的web服务已经变成了一个可靠的守护进程。

tmux

还有一种方法,那就是使用tmux。tmux可以在当前session里新建一个session。当前的session退出不会影响到新建的session。重新登录之后还可以连上之前建立的session。

// 新建 session
$ tmux new -s session_name

// 切换到指定 session
$ tmux attach -t session_name

// 列出所有 session
$ tmux list-sessions

// 退出当前 session,返回前一个 session 
$ tmux detach

// 杀死指定 session
$ tmux kill-session -t session-name

参考如何使用Tmux提高终端环境下的效率

systemd服务

systemd 是 Linux 下的一款系统和服务管理器。Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

在centos7中,我们也许会使用systemd来管理我们的一些程序,比如ssh:

// 启动ssh服务
systemctl start sshd.service
// 设置ssh服务开机启动
systemctl enable sshd.service
...

我们也可以通过systemd来管理我们的守护进程,成为真正意义上的系统服务。

关于systemd的使用不再赘述,参考Systemd (简体中文)

参考

Linux 守护进程的启动方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容