马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
跑 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企服评测-应用市场 编辑提示 |