参考: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`命令来运行一些长时间运行的任务,这些任务会将输出重定向到`nohup.out`文件中。随着运行时间的增长,这个文件可能会变得非常大,不仅占用大量磁盘空间,还可能影响系统的性能...
例如,`nohup ./execute.sh &`会启动`execute.sh`脚本并在后台运行,日志输出到`nohup.out`。 为了控制日志大小,我们可以使用重定向功能。例如,`nohup ./execute.sh > /home/xxx/log.log 2>&1 &`会将标准输出和...
Linux 是一个功能强大且广泛使用的操作系统,nohup 命令是 Linux 中的一个常用命令,用于在后台运行程序并将输出重定向到文件中。但是在使用 nohup 命令时,经常会遇到日志输出文件过大的问题,导致日志文件变得非常...
一般运行linux上的程序都是执行 .sh 文件(./sh文件),那如果不影响当前CMD窗口的操作,需要后台运行怎么办呢? 这时就需要借助 nohup 和 & 命令来实现。 nohup java -server -Xms128M -Xmx512M -XX:MetaspaceSize...
在Linux操作系统中,高效地利用系统资源是提升工作效率的关键,而这往往涉及到对前后台任务的巧妙管理和调度。本文主要探讨如何在Linux环境下有效地利用后台任务,以实现系统的加速运行。 首先,理解Linux的多任务...
nohup 命令是一个常用于 Linux 和 CentOS 操作系统中的命令,它可以使得程序在后台运行,不受终端的影响。下面是 nohup 命令的使用方法和参数解释: nohup 命令的基本语法 nohup 命令的基本语法是:nohup command...
本文介绍了如何在 Linux 系统中后台运行 MATLAB 文件,包括使用 nohup 命令和 Terminal 运行 MATLAB 文件两种方法。同时,强调了环境变量设置的重要性。后台运行 MATLAB 文件可以提高系统资源利用率和工作效率。
例如,`nohup java -jar app.jar >log 2>&1 &`将标准输出和错误都定向到`log`文件,而`nohup java -jar app.jar 2>&1 >log &`则会导致标准输出先被重定向到屏幕,然后再将标准错误重定向到屏幕,这不是我们期望的...
`Ctrl + Z` 可以将一个前台任务挂起,将其放到后台,并且处于暂停状态。要恢复后台的任务,可以使用 `fg %jobnumber` 命令,其中 `%jobnumber` 是 `jobs` 命令显示的作业编号。`jobs` 命令用于查看当前后台运行的...
- **场景一:后台运行任务** - 当需要执行一个耗时较长的任务,但又不希望该任务因为终端关闭而停止时,可以使用`nohup`命令。 - **场景二:避免SIGHUP信号** - 默认情况下,当一个终端会话结束时,所有由该会话启动...
之后可以通过`bg`命令将其恢复到后台继续运行。 - **nohup**: 使用`nohup`命令可以确保即使在用户退出登录后,命令仍然在后台继续运行。例如:`nohup command &` #### 三、`cron`与`crontab`命令 `cron`是Linux...
- `bg %n`:将暂停的前台任务编号为n的任务放到后台继续执行。 - `kill %n`:使用这个命令可以终止后台任务编号为n的进程。 掌握这些命令和技巧,你就能更有效地管理和控制在Linux系统中后台运行的服务程序,确保...
本篇文章将讨论如何让进程在后台可靠运行的几种方法,解决在 Linux 服务器上运行耗时较长的任务时遇到的问题。这些方法包括使用 nohup、setsid 以及 & 井号符号来让进程忽略 HUP 信号,从而避免中途失败。 1. nohup...
此外,`nohup`还会将标准输出重定向到一个名为`nohup.out`的文件中,以便于查看程序的输出。 #### 七、总结 通过以上介绍,我们可以看到在Linux中让命令在后台运行是非常方便的。无论是使用简单的`&`符号,还是利用...
一、问题: 今天在部署Python Flask项目到线上的时候,在虚拟环境中,运行项目可以正常访问到api,但是在Xshell中,一旦Ctrl+C或者关闭ssh,他就停止了,api再也请求不到了 二、nohup 1、nohup 是 no hang up 的缩写...
在Linux系统中,定时任务是运维工作中不可或缺的一部分,它能够帮助我们自动化执行一系列维护操作,例如定期删除旧日志、清理缓存等。本篇文章将深入讲解如何利用Linux的crontab工具设置定时删除任务,特别是针对...
- **输出管理**:默认情况下,使用`nohup`命令执行的任务输出会被重定向到一个名为`nohup.out`的文件中。若不想创建该文件,可以通过追加输出重定向来避免: ``` nohup java -jar shareniu.jar > /dev/null 2>&1 &...