Linux nohup配景启动/ 配景启动命令中nohup 、&、重定向的利用

[复制链接]
发表于 2026-10-3 11:16:07 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

跑 jar 包、起脚本,很多人习惯 java -jar demo.jar——一旦关掉 Xshell 窗口,进程跟着没了,日志日志还全糊在控制台上。nohup 就是为这个场景存在的。这篇把 nohup、&、重定向三者一次讲清楚,顺带说清 0/1/2 文件描述符那套符号。

一、nohup 解决什么问题

用 Xshell 这类工具远程执行脚本,网络一抖、终端一断,脚本跑到一半就意外结束。nohup 的作用就是不挂断:断开客户端连接后,服务端的命令照样跑。

它顺手还解决另一个问题:命令的输出默认不往终端打,而是落到一个文件。不然满屏日志日志刷得没法看。

二、nohup 和 & 不是一回事

这是最容易混的一点:

  • & 才是真正的后台运行;
  • nohup 只管"不挂断",它本身没有后台功能——用 nohup 跑命令,进程脱离用户终端,断开 SSH 也不受影响;
  • 所以正确的写法是两个一起用:nohup sh test.sh &。

只加 & 不加 nohup:有进程号,Ctrl+C 杀不掉,但终端一关就跟着停。只加 nohup 不加 &:是"不挂断的前台任务",你就得守着这个终端别关,也别 Ctrl+C。

三、日志日志文件默认写哪

不重定向时,nohup 会在当前目录生成一个 nohup.out。当前目录的 nohup.out 不可写了,它就输出到 $HOME/nohup.out。

四、重定向:把日志写到指定文件

改日志名就用 >:

nohup sh test.sh > test.log &

符号家族:

  • > 覆盖写入;
  • >> 追加写入;
  • 1> / 1>> 是标准输出的等价写法;
  • 2> 是标准错误;
  • 2>&1 把错误并进标准输出。

五、descriptor 0/1/2 到底指什么

  • 0:stdin,标准输入,键盘敲的内容;
  • 1:stdout,标准输出,该显示到屏幕的内容;
  • 2:stderr,标准错误,报错内容。

在 Linux 里 0/1/2 都是文件描述符。2>&1 是一个整体,> 左右不能有空格,意思是"把错误输出重定向到标准输出那边去",标准输出已经被指到了日志文件,所以错误也就跟着进日志文件了。

六、推荐写法(一条到位)

# 后台跑 test.sh,标准日志和错误日志都进 output.log
nohup ./test.sh > output.log 2>& &

# 等价于拆开写
nohup ./test.sh > output.log 2> output.log &
# 后台执行 out.sh,标准输出丢进 out.log,错误单独进 error.log
nohup ./out.sh > out.log 2>& &

生产里跑 jar 包就长这样:nohup java -jar demo.jar > demo.log 2>& &,日志留盘、进程守得住。

七、不想留日志

# 只用 /dev/null 空设备,什么都不存
nohup ./test.sh > /dev/null 2>& &

八、怎么确认它在跑

ps -aux | grep "test.sh"

ps 参数:a 显示全部进程,u 以用户为主格式显示,x 显示所有进程不区分终端。

九、运维时踩过的坑

日志涨太快,直接删 nohup.out?

千万别删。服务还持有那个文件的句柄,删了日志它继续往里写但你看不见,一旦出问题就是生产事故。正确做法是不停服务直接清空:

# 方法一
cat /dev/null > nohup.out

# 方法二
cp /dev/null nohup.out

只要错误日志

nohup ./test.sh > /dev/null 2> error.log &

总结

nohup 负责不挂断、& 负责后台、> 负责重定向,三者搭配才是完整方案。记牢 nohup 命令 > 日志 2>&1 & 这条万能格式,jar 包、shell 脚本都能这么起。日志要清理时用 cat /dev/null > 文件,别直接 rm。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表