如何在不停止的情况下知道正在执行哪个命令?

Dan*_*año 20 command-line make

在我的示例中,我正在运行一个需要很长时间才能执行的命令(几个小时)。

我真的不记得我输入的是 make 还是 make -j4。

当然,我可以停止它并按下键或检查历史记录以了解它,但这会停止该过程,我不希望这种情况发生(以防它已经在执行 make -j4)。

有没有办法在不停止进程的情况下知道正在执行哪个命令?

Joh*_*024 34

如果您想查看make计算机上运行的每个实例的完整命令行,请打开一个新终端并尝试:

pgrep -a make
Run Code Online (Sandbox Code Playgroud)

pgrep是一个搜索计算机上所有进程的程序。在这种情况下,它正在寻找名为 的程序make。该选项-a告诉pgrep列出每个匹配进程的进程 ID 和完整命令行。(没有-a,它只会返回进程 ID。)有关 pgrep 的许多选项的更多信息,请参阅man pgrep

  • 这对于问题中的简单情况很有用。但是,如果命令涉及管道、循环、命令序列、内部命令或变量扩展,您在 `pgrep` 中发现的内容将与在命令行上键入的命令不同。 (7认同)

小智 28

当终端窗口处于活动状态时,您可以按Ctrl+暂停(挂起)该过程Z。然后,您可以通过键入在后台推送作业bg(您的作业现在将在后台继续,您可以同时在命令行上工作;这相当于&在命令行末尾启动作业)。然后使用光标箭头(向上和向下)查看您使用的命令。如果您愿意(但这不是必需的),您可以通过键入fg.

  • @kasperd 是的,如果你问我的话很烦人,但我发现了一个很酷的解决方法来解决这个问题。将像这样的复杂命令括在括号中,因此它是一个子shell。然后 Ctrl-Z 将挂起整个子外壳并正确恢复。 (11认同)
  • 这适用于某些命令,但不是全部。例如,如果你输入了一个类似 `for X in {1..1000} 的循环;睡觉 $X ; done` 那么循环将被中断并且剩余的迭代不会发生。 (7认同)
  • 无需将作业置于后台:暂停它,检查历史记录(或`jobs`,如@ichabod 的回答所示),然后通过`fg` 恢复它就足够了。 (4认同)

小智 10

我做类似 Stefan: ^Z 的事情来暂停工作,然后我运行jobs. 如果您有多个进程在运行,您可能需要找出哪个作业是您暂停的作业,但这通常会给出命令行。然后运行fg继续执行。