解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】

转载自:https://www.cnblogs.com/bohaoist/p/4965103.html

 

问题描述:当SSH远程连接到服务器上,然后运行一个服务 ./catalina.sh start,然后把终端开闭(切断SSH连接)之后,发现该服务中断,导致网页无法访问。

 

解决方法:使用nohup命令让程序在关闭窗口(切换SSH连接)的时候程序还能继续在后台运行。

 

Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用& 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用& 结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行,并且希望在后台能够定期运行,那么就使用nohup:

       nohup /root/test.php &

  提示:

  [~]$ appending output to nohup.out

  嗯,证明运行成功,同时把程序运行的输出信息放到当前目录的nohup.out 文件中去。

 

nohup命令说明:

 

  用途:不挂断地运行命令。

 

  语法:nohup Command [ Arg ... ] [ & ]

 

  描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

 

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

 

  退出状态:该命令返回下列出口值:

 

  126 可以查找但不能调用 Command 参数指定的命令。

 

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

 

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

 

  nohup命令及其输出文件

 

  nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

 

  该命令的一般形式为:nohup command &

 

  使用nohup命令提交作业

 

  如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:(也就是说自定义输出的文件名)

 

  nohup command > myout.file 2>&1 &

 

  在上面的例子中,输出被重定向到myout.file文件中。

 

  使用 jobs 查看任务。

 

  使用 fg %n 关闭。

 

  另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样我就可以利用这些命令在后台上传和下载文件了。

 

思考:问题1为什么ssh一关闭,程序就不再运行了?

元凶:SIGHUP 信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:
进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。(关于孤儿进程参照:http://blog.csdn.net/hmsiwtv/article/details/7901711 )
结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了

 

例子:
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
[root@tivf09 root]# top

在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。
[root@tivf09 root]# ps -ef|grep top
root      5180  5128  0 01:03 pts/0    00:00:02 top
root      5857  3672  0 01:12 pts/2    00:00:00 grep top

使用pstree命令可以更清楚地看到这个关系:
[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top
          

使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。
[root@tivf09 root]# ps -xj|grep 5128
5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128

关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。
[root@tivf09 root]# ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128

问题2   为什么守护程序就算ssh 打开的,就算关闭ssh也不会影响其运行?
因为他们的程序特殊,比如httpd –k start运行这个以后,他不属于sshd这个进程组  而是单独的进程组,所以就算关闭了ssh,和他也没有任何关系!
[root@CentOS5-4 ~]# pstree |grep http
     |-httpd
[root@CentOS5-4 ~]# pstree |grep top
     |-sshd-+-sshd---bash---top


结论:守护进程的启动命令本身就是特殊的,和一般命令不同的,比如mysqld_safe 这样的命令 一旦使用了  就是守护进程运行。所以想把一般程序改造为守护程序是不可能,

问题3 使用后台运行命令&  能否将程序摆脱ssh进程组控制呢  也就是ssh关闭,后台程序继续运行?
我们做一个试验:  find / -name ‘*http*’&
利用ctrl+d 注销以后 再进入系统  会不会看见这个命令再运行?
答案是  :命令被中止了!!

因为他依然属于这个ssh进程组 就算加了&也无法摆脱!!
[root@CentOS5-4 ~]# pstree |grep find
     |-sshd-+-sshd---bash---find

结论就是:只要是ssh 打开执行的一般命令,不是守护程序,无论加不加&,一旦关闭ssh,系统就会用SIGHUP终止

问题4  nohup能解决的问题
但是为了能够再注销以后 依然能后台运行,那么我们就可以使用nohup这个命令,我们现在开始查找find / -name ‘*http*’&
,并且希望在后台运行,
那么就使用nohup:nohup find / -name "*httpd*"
此时默认地程序运行的输出信息放到当前文件夹的nohup.out 文件中去
加不加&并不会影响这个命令   只是让程序 前台或者后台运行而已

延伸:Linux命令nohup+screen命令

 

如果想在关闭ssh连接后刚才启动的程序继续运行怎么办,可以使用nohup。但是如果要求第二天来的时候,一开ssh,还能查看到昨天运行的程序的状态,然后继续工作,这时nohup是不行了,需要使用screen来达到这个目的。



虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

1)使用
执行screen , 按任意键进入子界面;
我用ping命令开始执行,如果下班了,但是想关闭ssh以后ping继续运行,那么按ctrl+a   再按d   这样暂停了子界面,会显示[detached]的字样,这时候 我回到了父界面;
用screen –ls查看目前子界面的状态screen -ls
There is a screen on: 22292.pts-3.free (Detached)
1 Socket in /tmp/screens/S-root,这里的22292其实是子界面的pid号;

如果回到子界面 用screen –r 22292,一下子弹到了ping 的子界面;

2)更多帮助
可以通过C-a(ctrl+a)?来查看所有的键绑定,常用的键绑定有:

C-a ?
显示所有键绑定信息
C-a w
显示所有窗口列表
C-a C-a
切换到之前显示的窗口
C-a c
创建一个新的运行shell的窗口并切换到该窗口
C-a n
切换到下一个窗口
C-a p
切换到前一个窗口(与C-a n相对)
C-a 0..9
切换到窗口0..9
C-a a
发送C-a到当前窗口
C-a d
暂时断开screen会话
C-a k
杀掉当前窗口
C-a [
进入拷贝/回滚模式

其他常用选项:

-c file
使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host]
不开启新的screen会话,而是断开其他正在运行的screen会话
-h num
指定历史回滚缓冲区大小为num行
-list|-ls
列出现有screen会话,格式为pid.tty.host
-d -m
启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host]
重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname
创建screen会话时为会话指定一个名字
-v
显示screen版本信息
-wipe [match]
同-list,但删掉那些无法连接的会话 

 

其他资料:

  1. Linux 技巧:让进程在后台可靠运行的几种方法,https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT大封号,注册功能关闭!亚洲成重灾区!

来源:量子位(ID:QbitAI ) 作者:明敏 萧箫 “不要登录ChatGPT!” “暂时远离人工智能和ChatGPT概念板块高位股!” 就在这两天,一些关于ChatGPT的疾呼突然在各种社交平台和群聊刷屏了。 而看到这…

突发 ChatGPT Plus停售?

现在,ChatGPT已不支持Plus付费了。 △ChatGPT截图 原因很简单:High demand。需求量太大,以至于OpenAI不得不暂停Plus的销售。 之后何时开放也没有明说。 前几天ChatGPT就因出现大规模封号引发热议,现在竟正儿八经地关闭了Plus…

突发!ChatGPT Plus停售!

Datawhale分享 最新:ChatGPT,来源:量子位 现在,ChatGPT已不支持Plus付费了。 △ChatGPT截图 需求量太大,地球上没有足够算力了? 原因很简单:High demand。需求量太大,以至于OpenAI不…

暂停更新,ChatGPT还能不能玩了

今天凌晨,一位网名anton的用户发推称:对GPT的需求如此之高,以至于现在新用户都无法升级到高级版了! 注意:官网只是说暂停升级,不是永久停售Plus! 一时间话题的焦点就引发到了“算力供应紧张”…

免费体验比ChatGPT更强大的AutoGPT

如果说chatgpt是汽车的话,那AutoGPT就是飞机 简单点说就是比chatGPT更进一步,AI自己上网、自己使用第三方工具、自己思考、自己操作你的电脑。执行设定的目标,直到完成。 不到3分钟搞定一个你想要的网站! Auto GPT与ChatGPT对比…

对抗 ChatGPT,免费体验 Claude

对抗 ChatGPT,免费体验 Claude Claude 是 Anthropic 构建的大型语言模型(LLM),对标ChatGPT。 Anthropic 创始团队多是前openai研究员和工程师,Claude 的特点是能够检测和回避ChatGPT的潜在陷阱,如逻辑错误…

都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平

一、博弈Ai:GPT3.5版 演示:点此进入 1、充当英语发言助手 评分:10分 总结:完整满足了指令需求 2、充当英汉互译器 评分:8分 总结:基本满足了我的指令需求。但是有点啰嗦,扣2分 二、ChatGP…

博弈Ai官网ChatGPT能力真实测评

链接:点此进入(基于ChatGPT4和3.5研发的智能聊天机器人国产镜像) 一,博弈Ai的UI设计样式 1、博弈Ai(ChatGPT)白天模式 2、博弈Ai(ChatGPT)黑天模式 3、博弈Ai(ChatGPT&a…

OpenAI Java SDK——chatgpt-java更新支持GPT-3.5-Turbo,支持语音转文字,语音翻译。

简介 chatgpt-java是一个OpenAI的Java版SDK,支持开箱即用。目前以支持官网全部Api。支持最新版本GPT-3.5-Turbo模型以及whisper-1模型。增加chat聊天对话以及语音文件转文字,语音翻译。 开源地址:https://github.com/Grt1228/chatgpt-java …

ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?

目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢? 分派的相关知识点总结: 分派是什么? 静态分派与动态分派: Java语言是静态多分派,动态单分派的; 静态分派:静态重载多分派…

使用java对接chatgpt(含全部代码)

使用java对接chatgpt(含全部代码) 因为对vscode不熟悉,前段界面我也是在idea里写的,先看一下效果图是这样,比较简陋 我直接上代码,关于chatgpt前端的html,对了因为这个是我用之前写的匿名群聊改…

【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来一键接入!!!

简介 ChatGPT Java版SDK开源地址&#xff1a;github.com/Grt1228/cha… &#xff0c;目前收获将近1000个star。 有bug欢迎朋友们指出&#xff0c;互相学习&#xff0c;所有咨询全部免费。 最新版&#xff1a;1.0.10 <dependency><groupId>com.unfbx</groupId&…

面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

JAVA 集成 chatGPT

1.文档地址&#xff1a; https://platform.openai.com/docs/introduction 下载demo&#xff1a;2. pom集成包 <dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>client</artifactId><version>0.9.0</vers…

2023ChatGPT整理回答的Java高级工程师面试题

本文整理了一些 ChatGPT 回答的 java 面试题,希望能够帮助到更多的人! 死锁与活锁的区别,死锁与饥饿的区别? 死锁和活锁都是多线程并发编程中的问题,它们的区别主要在于线程是否能够继续执行。 死锁指的是两个或以上进程因竞争资源而造成的一种互相等待的现象。当多个线…

java集成chatGpt完整案例代码(效果和官网一样逐字输出)

要集成chatGpt参考我上一篇文章即可。但是&#xff0c;如果要实现官网一样的效果&#xff0c;逐字输出&#xff0c;难度就提升了不少了。经过在官网的研究发现它应该是采用了SSE技术&#xff0c;这是一种最新的HTTP交互技术。SSE(Server-Sent Events):通俗解释起来就是一种基于…

【程序源代码】ChatGPT Java Api

“ 关键字: “ChatGPT AI 人工智能" 01 ———— 【总体介绍】 ChatGPT Java Api 使用 maven <dependency><groupId>com.github.plexpt</groupId><artifactId>chatgpt</artifactId><version>1.1.2</version> </dependency…

体验使用 InsCode AI 创作助手 来帮我完成一篇博客

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 InsCode AI 创作助手 它来啦回答不满意可以要求重新生成在输入 prompt 时&#…

厉害了!北大3位硕博生搞出ChatGPT版Excel!动动嘴就能自动处理表格……免费用!...

来源&#xff1a;量子位 做Excel表&#xff0c;真就动动嘴就够了&#xff01; 看&#xff0c;输入想要干的事&#xff1a;给学生成绩排个名吧。 简单敲个回车&#xff0c;表格唰一下就列好了&#xff01; 检查一遍也没错。 还能跨表格处理。 比如标记出两张不同表格中排名都在前…

「原驼」炸场:跑分达ChatGPT的99%,人类难以分辨!

源 | 量子位 大家好&#xff0c;这里是 NewBeeNLP。羊驼家族又出新品&#xff0c;直接炸场&#xff01;自动测试分数达到ChatGPT的99.3%&#xff0c;人类难以分辨两者的回答…… 这是开源大模型最新成果&#xff0c;来自羊驼家族的又一重磅成员——华盛顿大学原驼&#xff08;G…