📜  zsh 后台进程无输出 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:48:43.342000             🧑  作者: Mango

zsh 后台进程无输出 - Shell-Bash

介绍

在 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 的文件中。

方法三:使用 screentmux

screentmux 是两个流行的终端多路复用工具,它们可以让我们在一个终端里同时运行多个 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 命令将前台运行的进程转化为后台进程,并手动重定向输出。
  • 使用 screentmux 来在一个 session 中运行后台进程,并在其他 session 中查看输出信息。

如有其他解决方法欢迎在评论中补充。