摘要: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 %12、启动并立即 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