Linux :忘记使用nohup该如何补救

Linux :忘记使用nohup该如何补救

爱购物 m.cqfenfa.com

目录
  • Linux :忘记使用nohup该如何补救
    • 0x00 摘要
    • 0x01 问题描述
      • 1.1 为何关闭进程
      • 1.2 nohup 作用
    • 0x02 简述
      • 2.1 操作序列
      • 2.2 样例
    • 0x03 原理
      • 3.1 CTRL + Z
      • 3.2 jobs
      • 3.3 bg
      • 3.4 disown
      • 3.5 ps
      • 3.6 fg
    • 0xEE 个人信息
    • 0xFF 参考

0x00 摘要

在Linux做开发的同学也许会遇到这种困境:

  1. 运行了一个程序两个小时之后,你心想:再有一个小时程序就运行完了,于是你兴致勃勃的准备看结果。
  2. 女朋友突然发飙让自己立刻出现。
  3. 此时你突然发现自己没有使用 nohup,这就意味着这个程序在自己离开之后会死掉。之前两个小时的运行时间就浪费了。
  4. 于是你满怀悔恨的按下了CTR+c,然后使用 nohup 重新运行程序。

慢着,其实这种忘记 nohup 的情况是可以补救的,下面我们就看看如何操作。

0x01 问题描述

1.1 为何关闭进程

当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程

原因是:SSH会话关闭时,ssh所关联的pty关闭,系统会给这个pty所关联的session中的所有进程发送SIGHUP信号,SIGHUP的默认信号处理程序是终止进程,除非进程自己处理了SIGHUP。

因此,我们的解决办法就有两种途径:

  • 要么让进程忽略 HUP 信号;
  • 要么让进程运行在新的会话里从而成为不属于此终端的子进程;

1.2 nohup 作用

nohup命令对进程做了三件事。

  • 阻止SIGHUP信号发到这个进程。
  • 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。
  • 重定向标准输出和标准错误到文件nohup.out

也就是说,nohup命令实际上将子进程与它所在的 session 分离了。所以当shell窗口关闭时候,nohup 命令所在的进程也不会被结束。

0x02 简述

如果忘记使用了 nohup,该如何补救?具体操作如下:

2.1 操作序列

具体操作序列如下:

  1. 对于正在运行的进程,我们可以使用 ”CTRL+ z“ 来将当前进程挂起到后台暂停运行;
  2. 这时候进程已经进入后台暂停,我们使用 "jobs" 找到之前暂停的进程,每一个后台任务具有一个 jobnumber(任务的序列号,非PID)。
  3. 使用 "bg jobnumber" 让该进程进入后台运行;
  4. 再次使用 "jobs"查看进程状态,此时进程已经进入running 状态;
  5. 使用disown命令 "disown -h %jobnumber" 进行处理,这样该进程就会起到了 nohup 的同样作用;此时大功告成。
  6. 如果想继续查看,可以使用 ps 命令来查看进程状态;
  7. 可以使用 "fg" 把后台任务转成前台任务运行,此时可以对该进程进行操作,比如结束;

2.2 样例

我们以运行一个redis为例给出具体操作序列,具体如下图:

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &
mylinux $ jobs
[1]+  Running                 redis-server &
mylinux $ disown -h %1
mylinux $ ps -elf| grep redis
501 1987 521 4006 0 31 0 4289624 1932 - T 0 ttys001  0:00.01 redis-server *:6  9:49上午
mylinux $ fg
redis-server
^C1987:signal-handler (1616291836) Received SIGINT scheduling shutdown...
1987:M 21 Mar 09:57:16.634 # User requested shutdown...
1987:M 21 Mar 09:57:16.634 * Saving the final RDB snapshot before exiting.
1987:M 21 Mar 09:57:16.641 * DB saved on disk
1987:M 21 Mar 09:57:16.641 # Redis is now ready to exit, bye bye...      

0x03 原理

下面我们对操作命令的原理一一进行分析。

3.1 CTRL + Z

Ctrl+Z是把当前的程序挂起,暂停执行这个程序。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server  

这样程序就被挂起进入了后台。可以挂起好多进程到后台。

3.2 jobs

jobs命令用来查看当前有多少在后台运行。

在Linux中,启动、停止、终止以及恢复作业的这些功能统称为作业控制。作业控制中的关键命令是jobs命令,jobs命令允许查看shell当前正在处理的作业。jobs命令中输出有加号和减号,带加号的作业被当做默认作业,带减号的为下一个默认作业。

一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。

我们可以看到,此时 redis-server 就在后台运行,[1] 表示进程编号为 1。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server  

3.3 bg

bg命令能够将在后台暂停的命令,变为在后台进行继续执行。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &  

使用了bg之后,可以看到输出 redis-server 之后带了一个 &,表示已经后台运行。

我们也可以再次使用 jobs 查看进程状态。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &
mylinux $ jobs
[1]+  Running                 redis-server &  

3.4 disown

disown 命令 可以将指定任务从"后台任务"列表(jobs命令的返回结果)之中移除。一个"后台任务"只要不在这个列表之中,session 就肯定不会向它发出SIGHUP信号。这样就达到了 nohup 相同的作用。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &
mylinux $ jobs
[1]+  Running                 redis-server &
mylinux $ disown -h %1   

3.5 ps

当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &
mylinux $ jobs
[1]+  Running                 redis-server &
mylinux $ disown -h %1
mylinux $ ps -elf| grep redis
501 1987 521 4006 0 31 0 4289624 1932 - T 0 ttys001  0:00.01 redis-server *:6  9:49上午

3.6 fg

fg 命令能够将在后台运行的命令调至前台进行运行,如果后台运行的任务数量比较多,可以通过选择jobnumber(任务的序列号,非PID)来进行选择。

另外关于当前任务,如果后台运行的任务号有2个时候,当1号任务执行完毕之后,2号任务此时就为当前任务,那么使用fg、bg等命令不加上job number的时候,默认为变动的都是当前任务。

mylinux $ redis-server
* The server is now ready to accept connections on port 6379
^Z
[1]+  Stopped                 redis-server
mylinux $ jobs
[1]+  Stopped                 redis-server
mylinux $ bg 1
[1]+ redis-server &
mylinux $ jobs
[1]+  Running                 redis-server &
mylinux $ disown -h %1
mylinux $ ps -elf| grep redis
501 1987 521 4006 0 31 0 4289624 1932 - T 0 ttys001  0:00.01 redis-server *:6  9:49上午
mylinux $ fg
redis-server    

0xEE 个人信息

★★★★★★关于生活和技术的思考★★★★★★

微信公众账号:罗西的思考

如果您想及时得到个人撰写文章的消息推送,或者想看看个人推荐的技术资料,敬请关注。

在这里插入图片描述

0xFF 参考

https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

https://www.ibm.com/developerworks/cn/linux/l-cn-screen/

nohup命令_掌握这几个命令,Linux后台任务提交,前后台任务转换随便玩

Linux的jobs命令

Linux jobs命令:查看当前终端放入后台的工作

Linux 守护进程的启动方法

Linux中shell关闭后,nohup让程序依然在后台运行

nohup:关闭shell程序依然执行

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想重启运行在Linux上的Java进程,可以使用以下步骤: 1. 查找正在运行的Java进程的进程ID(PID)。您可以通过运行以下命令来查找正在运行的Java进程: ``` ps -ef | grep java ``` 这将列出所有正在运行的Java进程,并显示它们的PID。 2. 使用kill命令停止正在运行的Java进程。您可以使用以下命令停止进程: ``` kill -9 <PID> ``` 其中<PID>是步骤1中找到的Java进程的PID。 3. 使用nohup命令启动Java进程。您可以使用以下命令启动Java进程: ``` nohup java -jar <your_jar_file_name>.jar & ``` 其中<your_jar_file_name>.jar是您的Java应用程序的JAR文件名。 注意,使用nohup命令启动Java进程将使Java进程在后台运行,并且在您注销或关闭终端会话时不会停止。 ### 回答2: 在Linux系统中,使用nohup命令可以在终端关闭后保持进程继续运行,即使当前用户已退出。重启Java进程也可以使用nohup来实现。 首先,在终端中使用以下命令来启动Java进程,并且使用nohup命令使其在后台运行: ``` nohup java -jar your_java_program.jar & ``` 这条命令中的`your_java_program.jar`是你要运行的Java程序包的文件名。这个命令将会在终端关闭后继续在后台运行Java进程。 如果需要重启Java进程,我们可以通过以下步骤来实现: 1. 首先,需要找到Java进程的进程ID(PID)。可以使用ps命令来查看所有正在运行的Java进程,并找到对应的PID: ``` ps aux | grep java ``` 这个命令将会列出所有包含"java"关键字的进程信息,找到你要重启的Java进程对应的PID。 2. 找到PID后,可以使用kill命令来终止该进程: ``` kill PID ``` 将PID替换为上一步骤中找到的Java进程的PID。 3. 终止进程后,再次使用nohup命令来重新启动Java进程: ``` nohup java -jar your_java_program.jar & ``` 这个命令会启动一个新的Java进程,并将其放入后台运行。 通过以上步骤,就可以实现在Linux系统中使用nohup命令重启Java进程。无论是在终端关闭后还是手动重启,都可以保持Java进程继续运行。 ### 回答3: 在Linux上,我们可以使用nohup命令重启Java进程。nohup命令的作用是在当前终端断开连接后仍然能够继续执行命令,并且将命令的输出重定向到一个指定的文件中。 要重启一个Java进程,首先需要找到该进程的进程ID(PID)。我们可以使用如下命令找到正在运行的Java进程: ``` ps -ef | grep java ``` 查找到相关的进程后,可以根据需要选择要重启的进程。然后,使用kill命令终止该进程: ``` kill -9 <PID> ``` 需要注意的是,上述命令中的`<PID>`应替换为要终止的Java进程的实际进程ID。 接下来,使用nohup命令以后台方式启动Java进程,并将输出重定向到一个日志文件中: ``` nohup java -jar your_jar_file.jar > your_log_file.log & ``` 在上述命令中,`your_jar_file.jar`应替换为你实际的Java可执行文件,而`your_log_file.log`则是你希望将输出信息存储的日志文件名。 最后加上`&`符号,使得该命令在后台运行。 通过上述命令,我们成功地使用nohup命令重启了Java进程,并且在断开连接后仍然能够继续运行。同时,重定向的日志文件也可以用于后续的排错和日志记录。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值