每日Linux学习:使用 nohup 和 disown 保持后台进程运行

360影视 日韩动漫 2025-05-27 09:38 2

摘要:nohup命令用于运行不受挂起信号影响的进程,即使终端关闭,进程也会继续运行。

一、nohup命令

nohup命令用于运行不受挂起信号影响的进程,即使终端关闭,进程也会继续运行。

用法:

nohup command [arguments] & # & 表示后台运行,这个可不能丢

实例:

1、运行一个 Python 脚本并在后台持续运行:

nohup python3 myscript.py > output.log 2>&1 &

2、运行一个长时间执行的命令:

nohup ./long_running_process.sh > /dev/null 2>&1 &

有关2>&1 & 的含义请参考我的一篇老文章《Linux基础之/dev/null 2>&1 &》

特点:

如果没有指定输出文件,默认会输出到nohup.out文件(输出文件在当前目录)

进程会忽略 SIGHUP 信号(终端关闭时发送的信号)

二、disown命令

disown用于移除作业与当前Shell的关联,使其在终端关闭后仍能继续运行(无法通过 jobs 管理)。

用法:

1、首先将命令放入后台:

command &

2、然后使用 disown:

disown -h %jobnumber

注意:可以通过jobs或jobs -l (-l参数能够看到进程PID)来查看jobnumber

-h:标记作业为“不接收终端关闭时的SIGHUP信号”,但保留在作业表中(仍可查看)。

不带参数:直接移除作业(无法再用 jobs 查看)。

实例:

1、启动一个后台进程然后 disown 它:

./my_server.sh &disown -h %1

2、启动并立即 disown:

./background_task.sh & disown

特点:

需要先启动进程(通常带 &)

可以从作业表中完全移除作业(使用 disown -r)

不会自动重定向输出,需要手动处理

三、如何将已经在前台运行的进程调入后台运行呢?

1、先按 Ctrl+Z 暂停,暂停时会显示其作业号,显示效果如:

进入vim后按ctrl+z停止

2、bg %1 #将任务1在后台继续运行(刚刚Ctrl+Z暂停了,bg恢复运行并且调入后台)

会看到vim 后面加上&,也就是进入后台运行

注意:为什么这个执行了bg但进程仍旧是停止状态呢?因为vim程序是必须要前端执行(依赖终端输入输出),因此当你把它调入后台,还是会自动停止。如果使用sleep、wget等不依赖终端输入输出的程序,执行bg就会正常工作。

3、disown %1 #移除作业号1的后台进程与Shell的关联,这时使用jobs就看不到了。被disown的进程不再受Shell控制,需通过ps查找其PID后用 kill 终止。

disown将后台进程断开与Shell的关联

jobs查看是看不到的

只有通过ps -ef才能查找到进程

四、如何将后台运行的进程调入前台运行?

1、使用jobs查看当前Shell管理的后台或挂起的任务,如:

vim & 进入后台,jobs会发现任务1【已停止】

2、将任务调入前台

fg %1 #将任务1调入前台

vim编辑页面进入前台显示

vim再次回到前台

总结:

建议对于新启动的进程,推荐使用 nohup

nohup your_command > output.log 2>&1 &

来源:最亮的星ab

相关推荐