`
san_yun
  • 浏览: 2651993 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

linux 后台任务console重定向到日志(nohup)

 
阅读更多

参考:http://hi.baidu.com/hwyawekerrfhlve/item/e80c3be119f2a32c5a7cfbeb

 

今天在公司服务器上跑程序,用SSH连接上服务器,输入sh auto.sh命令执行,程序开始运行,但是关掉SSH程序终止运行。

记得以前可以在最后加上一个“&”,程序会在后台运行。尝试了一下,输入:sh auto.sh &。运行ps -ef,发现进程在运行,关掉SSH,再打开,输入ps -ef,进程仍然存在。:-)

不过有个问题:程序会在运行中输出日志,并是通过java的日志类进行输出的。而如果关掉SSH运行程序,就会丢失这些信息。直观的解决办法是将输出到控制台的日志重定向到文件中,于是我将命令改为:sh auto.sh > console.txt &。不过事实并没像我想的那样,console.txt虽然被创建了,而日志并没有写在其中。后来请教Robert Chen,他让我用sh auto.sh >console.txt 2>&1 & 命令试一下,我输入了这个隐晦的命令之后,原本输出到控制台的日志内容终于被重定向到console.txt了。

下面来详细分析一下这条命令:

sh auto.sh 运行shell脚本

>console.txt 将标准输出重定向到console.txt文件中

其实操作系统有三个常用的流:

0:标准输入流 stdin

1:标准输出流 stdout

2:标准错误流 stderr

一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

java的日志类默认是输出到system.err中,所以要想将日志内容重定向到console.txt,需要将stderr重定向到console.txt.

将stderr重定向到console.txt的命令是 2 < console.txt。

不过有个问题,stdout是有缓冲的,而stderr是没有缓冲的,原因很简单,stderr一般是系统发生错误,比如编译一个程序出错,需要立即给出编译错误提示。

所以如果写成 sh auto.sh > console.txt 2 > console.txt就会出现问题。

再来看看 >& 操作符:

重定向操作符 描述

>

将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。

<

从文件而不是从键盘或句柄读入命令输入。

>>

将命令输出添加到文件末尾而不删除文件中已有的信息。

>&

将一个句柄的输出写入到另一个句柄的输入中。

<&

从一个句柄读取输入并将其写入到另一个句柄输出中。

|

从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

 

而句柄的定义就是:

句柄 句柄的数字代号 描述

STDIN

0

键盘输入

STDOUT

1

输出到命令提示符窗口

STDERR

2

错误输出到命令提示符窗口

UNDEFINED

3-9

句柄由应用程序单独定义,它们是各个工具特有的

 

所以 2 >& 1就是把 stderr重定向到stdout 由于stdout被重定向到 console.txt,所以最终stderr,stdout均被重定向到console.txt并且解决了两者缓冲区不一致的问题。

分享到:
评论

相关推荐

    Linux-nohup日志拆分

    在Linux环境下,我们经常会使用`nohup`命令来运行一些长时间运行的任务,这些任务会将输出重定向到`nohup.out`文件中。随着运行时间的增长,这个文件可能会变得非常大,不仅占用大量磁盘空间,还可能影响系统的性能...

    详解linux下nohup日志输出过大问题解决方案

    例如,`nohup ./execute.sh &`会启动`execute.sh`脚本并在后台运行,日志输出到`nohup.out`。 为了控制日志大小,我们可以使用重定向功能。例如,`nohup ./execute.sh &gt; /home/xxx/log.log 2&gt;&1 &`会将标准输出和...

    linux下nohup日志输出过大问题的解决方法

    Linux 是一个功能强大且广泛使用的操作系统,nohup 命令是 Linux 中的一个常用命令,用于在后台运行程序并将输出重定向到文件中。但是在使用 nohup 命令时,经常会遇到日志输出文件过大的问题,导致日志文件变得非常...

    Linux nohup实现后台运行程序及查看(nohup与&)

    一般运行linux上的程序都是执行 .sh 文件(./sh文件),那如果不影响当前CMD窗口的操作,需要后台运行怎么办呢? 这时就需要借助 nohup 和 & 命令来实现。 nohup java -server -Xms128M -Xmx512M -XX:MetaspaceSize...

    巧妙运用前后台任务让Linux系统加速

    在Linux操作系统中,高效地利用系统资源是提升工作效率的关键,而这往往涉及到对前后台任务的巧妙管理和调度。本文主要探讨如何在Linux环境下有效地利用后台任务,以实现系统的加速运行。 首先,理解Linux的多任务...

    nohup使用方法LINUX|CENTOS

    nohup 命令是一个常用于 Linux 和 CentOS 操作系统中的命令,它可以使得程序在后台运行,不受终端的影响。下面是 nohup 命令的使用方法和参数解释: nohup 命令的基本语法 nohup 命令的基本语法是:nohup command...

    linux后台运行m(matlab)文件

    本文介绍了如何在 Linux 系统中后台运行 MATLAB 文件,包括使用 nohup 命令和 Terminal 运行 MATLAB 文件两种方法。同时,强调了环境变量设置的重要性。后台运行 MATLAB 文件可以提高系统资源利用率和工作效率。

    Linux 运行jar包的几种方式

    例如,`nohup java -jar app.jar &gt;log 2&gt;&1 &`将标准输出和错误都定向到`log`文件,而`nohup java -jar app.jar 2&gt;&1 &gt;log &`则会导致标准输出先被重定向到屏幕,然后再将标准错误重定向到屏幕,这不是我们期望的...

    linux后台执行命令&和nohup的具体使用方法

    `Ctrl + Z` 可以将一个前台任务挂起,将其放到后台,并且处于暂停状态。要恢复后台的任务,可以使用 `fg %jobnumber` 命令,其中 `%jobnumber` 是 `jobs` 命令显示的作业编号。`jobs` 命令用于查看当前后台运行的...

    nohup命令详解.txt

    - **场景一:后台运行任务** - 当需要执行一个耗时较长的任务,但又不希望该任务因为终端关闭而停止时,可以使用`nohup`命令。 - **场景二:避免SIGHUP信号** - 默认情况下,当一个终端会话结束时,所有由该会话启动...

    Linux后台运行命令

    之后可以通过`bg`命令将其恢复到后台继续运行。 - **nohup**: 使用`nohup`命令可以确保即使在用户退出登录后,命令仍然在后台继续运行。例如:`nohup command &` #### 三、`cron`与`crontab`命令 `cron`是Linux...

    Linux后台运行py服务程序1

    - `bg %n`:将暂停的前台任务编号为n的任务放到后台继续执行。 - `kill %n`:使用这个命令可以终止后台任务编号为n的进程。 掌握这些命令和技巧,你就能更有效地管理和控制在Linux系统中后台运行的服务程序,确保...

    Linux技巧:让进程后台运行

    本篇文章将讨论如何让进程在后台可靠运行的几种方法,解决在 Linux 服务器上运行耗时较长的任务时遇到的问题。这些方法包括使用 nohup、setsid 以及 & 井号符号来让进程忽略 HUP 信号,从而避免中途失败。 1. nohup...

    linux命令在后台运行

    此外,`nohup`还会将标准输出重定向到一个名为`nohup.out`的文件中,以便于查看程序的输出。 #### 七、总结 通过以上介绍,我们可以看到在Linux中让命令在后台运行是非常方便的。无论是使用简单的`&`符号,还是利用...

    【已解决】利用nohup使得Python Flask项目在Ubuntu系统上后台运行

    一、问题: 今天在部署Python Flask项目到线上的时候,在虚拟环境中,运行项目可以正常访问到api,但是在Xshell中,一旦Ctrl+C或者关闭ssh,他就停止了,api再也请求不到了 二、nohup 1、nohup 是 no hang up 的缩写...

    Linux后台运行java的jar包.docx

    - **输出管理**:默认情况下,使用`nohup`命令执行的任务输出会被重定向到一个名为`nohup.out`的文件中。若不想创建该文件,可以通过追加输出重定向来避免: ``` nohup java -jar shareniu.jar &gt; /dev/null 2&gt;&1 &...

    Liunx系统定时删除任务,定时清理日志,定时清理任务

    在Linux系统中,定时任务是运维工作中不可或缺的一部分,它能够帮助我们自动化执行一系列维护操作,例如定期删除旧日志、清理缓存等。本篇文章将深入讲解如何利用Linux的crontab工具设置定时删除任务,特别是针对...

Global site tag (gtag.js) - Google Analytics