📅  最后修改于: 2023-12-03 14:48:43.342000             🧑  作者: Mango
在 Shell-Bash 编程中,我们常常需要在后台运行一些长时间运行的进程。然而,有时候我们却无法从这些后台进程中获取任何输出信息,这就让调试和分析变得更加困难。
在本文中,我们将介绍一些解决这个问题的方法,帮助你从后台进程中获取输出信息。
nohup
nohup
命令可以让我们在后台运行进程,并忽略掉所有的 SIGHUP 信号,这样子就能确保进程不会因为终端被关闭而停止。同时,nohup
还会输出一个文件,里面包含了进程的标准输出和错误输出信息。
下面是一个使用 nohup
来运行后台进程的例子:
nohup long-running-command > output.log 2>&1 &
在这个例子中,我们使用了重定向符号 >
来将标准输出和错误输出都写入名为 output.log
的文件中。同时,2>&1
将标准错误输出重定向到标准输出中。最后,&
符号将进程放到后台运行。
disown
disown
命令可以让我们将一个前台运行的进程变成后台运行的进程。与 nohup
不同的是,disown
并没有重定向输出,所以我们需要手动进行重定向。
下面是一个使用 disown
来运行后台进程的例子:
long-running-command > output.log 2>&1
^Z
bg
disown
在这个例子中,我们先将进程放到后台运行,然后使用 disown
命令将其从当前 shell 中分离出来。最后,我们手动将标准输出和错误输出重定向到名为 output.log
的文件中。
screen
或 tmux
screen
和 tmux
是两个流行的终端多路复用工具,它们可以让我们在一个终端里同时运行多个 shell。这意味着我们可以在其中一个 session 中运行后台进程,而在其他 session 中查看它们的输出信息。
下面是一个使用 screen
来运行后台进程的例子:
screen -dmS my-session
screen -S my-session -X stuff "long-running-command > output.log 2>&1$(printf \\r)"
在这个例子中,我们首先创建了一个名为 my-session
的新 session,并将其放到后台运行。然后,我们使用 screen -S
来进入该 session,使用 screen -X
来发送一个字符串,这个字符串是我们要在 session 中运行的命令。注意,我们使用了 $(printf \\r)
来模拟回车键。
以上介绍了三种获取后台进程输出信息的方法:
nohup
命令来运行后台进程并重定向输出到文件中。disown
命令将前台运行的进程转化为后台进程,并手动重定向输出。screen
或 tmux
来在一个 session 中运行后台进程,并在其他 session 中查看输出信息。如有其他解决方法欢迎在评论中补充。