Linux编程
20230620_Linux中nohup的使用: 后台运行与输出重定向技巧
在Linux系统中,我们经常需要让程序在后台运行,以便能够在关闭终端后仍然继续执行。为了实现这一目的,我们需要使用一些特殊的命令和符号。本文将重点介绍nohup、&和2>&1这三个命令及符号,并通过实例详细说明它们的使用方法。
(1) nohup
nohup(No Hang Up,不挂断)是一个常用的Linux命令,用于在终端关闭后使程序继续运行。当我们使用nohup运行某个命令时,系统会忽略挂断(SIGHUP)信号,使得该命令在后台运行并将输出重定向至nohup.out文件中。
例如,我们要运行一个名为my_script.sh的脚本,可以使用以下命令:
nohup ./my_script.sh &
这里,&表示将程序放入后台运行。我们稍后会详细讨论这个符号。
(2) &
&是一个控制操作符。当我们在命令后面添加&,该命令将在后台执行,而不会占用终端窗口。这样我们可以在终端继续输入其他命令,而不需要等待当前命令执行完毕。
例如,我们要在后台运行一个名为my_program的程序,可以使用以下命令:
./my_program &
这样,my_program就会在后台运行,你可以通过jobs命令查看后台运行的程序列表。
(3) 2>&1
2>&1是一种IO重定向。在Linux系统中,每个进程都有三个默认的文件描述符:标准输入(stdin, 0),标准输出(stdout, 1),标准错误输出(stderr, 2)。2>&1表示将标准错误输出合并到标准输出上。
这在我们希望将程序的输出和错误信息都记录到一个文件中时非常有用。例如,我们要将my_program的输出和错误信息都记录到log.txt中,可以使用以下命令:
./my_program > log.txt 2>&1 &
这里,>表示将标准输出重定向至log.txt,而2>&1表示将标准错误输出合并到标准输出上。&表示将程序放入后台运行。
(4) >/dev/null 2>&1
/dev/null 代表空设备文件,也就是不输出任何信息到终端。
操作系统中有三个常用的流: 0:标准输入流 stdin 1:标准输出流 stdout 2:标准错误流 stderr
" >/dev/null" 等价于 "1>/dev/null",表示标准输出(1)输出到 /dev/null 中,即终端不输出标准输出信息;
"2>&1" 中的 “ & ” 是等价于的意思,表示 标准错误(2)输出的位置 等价于 标准输出(1)的位置,即等价于 “2>/dev/null”, 即终端不输出标准错误信息。
因此," >/dev/null 2>&1" 表示 标准错误信息和标准输出信息,在终端上均不输出。
nohup ./my_program > /dev/null 2>&1 &
该命令表示在linux终端中既不输出标准输出信息也不输出标准错误信息,使用nohup之后,除了程序产生的结果之外,不会生成任何日志文件。
(5) 结合nohup使用
在实际应用中,我们可能希望将nohup和2>&1结合使用,以实现在后台运行程序的同时,将输出和错误信息记录到指定文件中。例如:
nohup ./my_program > nohup_output.log 2>&1 &
这样,my_program将在后台运行,并将输出和错误信息都记录到nohup_output.log文件中。
总结
在Linux系统中,nohup、&和2>&1都是实现后台运行和输出重定向的有用工具。理解它们的作用和用法,可以帮助我们更高效地管理后台进程和处理程序输出。