当前位置: 首页 > Linux

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

时间:2023-04-07 01:05:17 Linux

后台Linux下,我们通常通过SSH登录服务器进行操作。一般的维护命令,我直接输入命令make,makeinstall或者脚本文件的路径(相对路径或者绝对路径)./configure都可以执行。这是前台进程,用户可以通过控制台看到命令执行界面,可以通过Ctrl+C结束进程。但是当我们要启动一个服务时,在服务结束后继续在同一个SSH会话中执行其他命令开始了;或者启动服务后,我们希望SSH退出后服务还能继续运行,应该如何实现呢?让我们编写一个简单的脚本来模拟一个长时间运行的程序。脚本文件名:run.py#!/bin/pythonfromtimeimportsleepwhileTrue:sleep(1)print("x",end="",flush=True)backgroundprocess启动服务时,希望命令后台运行,可以在命令末尾加上&,例如:./run.py&,执行完以上命令后,脚本开始后台运行,命令行回显为[1]12532,其中1代表后台进程数,可以通过命令fg1将进程切换回前台。此时虽然该命令已经在后台运行,但是我们可以在控制台输入其他命令,但是脚本每秒打印的x会不断的输出到控制台,影响我们其他命令的执行。这个时候我还需要用输出重置Orientate到输出命令执行结果的文件。输出重定向一个程序执行后,系统会产生三个句柄,分别是:0=stdin(标准输入)1=stdout(标准输出)2=stderr(错误输出)默认情况下,这三个句柄指向当前会话命令线控制台。命令在后台执行后,stdin关闭,stdout和stderr仍然指向控制台。在命令后使用输出重定向器>重定向输出。./run.py>run.log&表示将stdout重定向到当前目录下的run.log文件。./run.py>run.log2>&1&表示将stdout和stderr都重定向到run.log,其中2>&1表示将stderr重定向到stdout。虽然nohup可以通过&作为后台进程执行命令,但是如果SSH会话中断退出,所有与该会话相关的进程都会被终止。如果我们登录服务器启动一个服务程序,启动后不能一直保持SSH会话打开,会话到期后会自动终止。这就是,我们可以使用nohup(不挂断)来执行进程,这个命令保证会话挂断后命令可以继续运行。对于使用nohup运行的命令,系统默认自动将stdout和stderr重定向到当前目录下的nohup.out文件。nohup./run.py&nohup和&&的区别:后台进程执行命令,但是会话关闭后,进程就会结束。nohup:保证进程不挂掉,但是没有后台执行功能,所以一般需要nohup和&一起使用。