linux进程重定向输出,Linux下的后台进程、nohup、输出重定向

背景

Linux下,我们一般通过SSH登录到服务器进行操作,对于一般维护性命令,我直接输入命令 make、make install 或脚本文件的路径(相对路径或绝对路径)./configure 执行即可。

这就是前台进程,用户可以通过控制台看到命令执行的接口,可以通过 Ctrl +C 结束进程。

但当我们想执行启动一个服务,服务启动后在同一个SSH会话里继续执行其他命令;或者启动服务后,希望SSH退出后服务能继续运行,应该怎么实现呢?

我们写一个简单的脚本来模拟长时间运行的程序。

脚本文件名称: run.py

#!/bin/python

from time import sleep

while True:

sleep(1)

print("x", end=" ", flush=True)

后台进程

当启动一个服务后,希望命令在后台运行时,可以通过在命令末尾增加 &,例如:./run.py &,执行上述命令后,脚本开始在后台运行,并且命令行回显为 [1] 12532 ,这里的 1表示后台进程的编号,可以通过命令 fg 1 把进程切换回前台运行。

此时,虽然命令已经后台运行了,我们可以在控制台输入其他命令,但是脚本每秒打印的 x 会不断的输出到控制台,影响我们其他命令的执行,这时,我也需要用输出重定向把命令的执行结果输出的文件中。

输出重定向

一个程序执行后,系统会生成三个句柄,分别是:

0=stdin(标准输入)

1=stdout(标准输出)

2=stderr(错误输出)

默认情况下,三个句柄都指向当前会话的命令行控制台。命令转到后台执行后,stdin关闭,stdout和stderr还是指向控制台。

通过在命令后使用输出重定向符 > 实现对输出的重定向。

./run.py > run.log &

表示把stdout重定向到当前目录的run.log文件。

./run.py > run.log 2>&1 &

表示把stdout和stderr都重定向到run.log,其中 2>&1 表示把stderr重定向到stdout。

nohup

通过 & 虽然可以把命令以后台进程的方式执行,但是如果SSH会话中断退出,和此会话相关的所有进程都会终止。

如果我们是登录服务器去启动一个服务程序,总不能启动后一直把SSH会话开着,而且会话到期会自动终止。

这是,我们可以使用 nohup(no hung up)来执行进程,此命令确保会话挂断后,命令可以继续运行。以nohup运行的命令,系统默认自动把stdout和stderr重定向到当前目录的nohup.out文件。

nohup ./run.py &

nohup和&的区别

&:已后台进程执行命令,但是会话关闭后,进程会结束。

nohup:确保进程不挂断的执行,但是没有后台执行的功能,所以一般nohup和&需要配合一起使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值