千家信息网

怎样进行nohup linux后台运行输出

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,怎样进行nohup linux后台运行输出,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。后台运行新利器:tmux关于jobs 的用法 j
千家信息网最后更新 2026年11月02日怎样进行nohup linux后台运行输出

怎样进行nohup linux后台运行输出,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

后台运行新利器:tmux

关于jobs 的用法 jobs

遇到问题

nohup python flush.py &

这样运行,生成了nohup.out文件,但是内容始终是空的,试了半天也不行。浪费了不少时间。

原因

python的输出又缓冲,导致out.log并不能够马上看到输出。-u 参数,使得python不启用缓冲。

解决

nohup python -u flush.py > flush.log 2>&1 &

linux命令后台运行

有两种方式:

1. command & : 后台运行,你关掉终端会停止运行
2. nohup command & : 后台运行,你关掉终端也会继续运行

一、 简介
Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用Ctrl-Z ,挂起这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了。

& 将指令丢到后台中去执行
[ctrl]+z 將前台任务丟到后台中暂停
jobs 查看后台的工作状态
fg %jobnumber 将后台的任务拿到前台来处理
bg %jobnumber 将任务放到后台中去处理
kill 管理后台的任务

二、&

在Linux中,当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208$ jobs -l
[1]+ 17208 Running ./test.sh &
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &
在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。
例:查找名为"httpd.conf"的文件,并把所有标准输出和错误输出重定向到find.dt的文件中:

# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & [2] 7832


成功提交该命令之后,系统给出了它的进程号7832。 对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行,例如对正在前台执行的tesh.sh使用ctrl+z挂起它:

$ ./test.sh[1]+ Stopped                 ./test.sh$ bg %1[1]+ ./test.sh &$ jobs -l[1]+ 22794 Running                 ./test.sh &
$ echo $$21734$ nohup ./test.sh &[1] 29016$ ps -ef | grep test515      29710 21734 0 11:47 pts/12   00:00:00 /bin/sh ./test.sh515      29713 21734 0 11:47 pts/12   00:00:00 grep test$ setsid ./test.sh &[1] 409$ ps -ef | grep test515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh515        413 21734 0 11:49 pts/12   00:00:00 grep test

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者se

$ screen -dmS screen_test$ screen -listThere is a screen on:        27963.screen_test       (Detached)1 Socket in /tmp/uscreens/S-jiangfeng.$ screen -r screen_test

tsid将将父进程设为init进程(进程号为1)
上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

$ ./test.sh &[1] 2539$ jobs -l[1]+ 2539 Running                 ./test.sh &$ disown -h %1$ ps -ef | grep test515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh515       2542 21734 0 11:52 pts/12   00:00:00 grep test
$ (./test.sh &)$ ps -ef | grep test515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh515      12483 21734 0 11:59 pts/12   00:00:00 grep test


另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:
注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

看完上述内容,你们掌握怎样进行nohup linux后台运行输出的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

后台 运行 进程 命令 输出 作业 任务 前台 终端 文件 方法 程序 内容 正在 问题 面的 管理 成功 信号 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技 百单网互联网科技有限公司 互联网科技工作委员会 互联网科技行业发展 科技和互联网公司 美国互联网科技 西安互联网科技 多迪互联网科技有限公司 汉立互联网科技有限公司联系电话 互联网科技创新服务 崇明区互联网教育科技诚信经营 苏州铭阳互联网科技有限公司 玉溪新华互联网科技好不好 深圳互联网科技的发展 黑云互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 杭州融税互联网科技有限公司 互联网科技对化妆品行业 互联网领先科技成果宣传视频 如何强化互联网金融科技 新华互联网科技学校 科技创新与互联网经济 齐家互联网科技 互联网科技网站 互联网对科技的发展 新兴科技互联网创新大赛颁奖典礼 注册互联网科技公司经营范围大全 工业互联网展湾科技股份有限公司 数字互联网科技有限公司 现代科技的标志之一的互联网
0