后台进程不带“&”

后台进程不带“&”

假设您在 Linux 中启动了一个新应用程序(如文本编辑器等),但您忘记使用“&”。您将使用什么命令来使该进程在后台运行,而不必关闭该应用程序?通过这种方式,您可以打开两个进程并单独工作(例如,用于创建进程的命令行终端和文本编辑器等进程仍在运行。?

答案1

在终端窗口中,您通常会键入Control+Z来“暂停”进程,然后使用bg命令将其“后台化”。

例如使用睡眠命令

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

我们可以看到该进程正在运行,并且我仍然有命令行。

答案2

Ctrl+Z是执行此操作的方法,但只是为了完整性:问题要求“命令”,这将是(从另一个终端):

kill -STOP pid_of_the_running_applications

然后当然

bg

从应用程序终端。

答案3

在重击中:

Ctrl+Z然后bg.

现在运行jobs并查看结果。

答案4

作为避免按CTRL-带来不便的预防措施z,您可以为编辑器创建一个包装脚本,以便在后台运行编辑器。这样你就不需要记住在后台显式启动它:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

上面我们首先尝试确定您是否有可用的 X 服务器,然后才在后台运行编辑器(如果没有,许多 Unix 编辑器将使用您的终端,并且在这种情况下您不希望将编辑器作为后台进程运行) 。它将把所有参数逐字传递给您选择的编辑器 ( "$@"),就像您为包装器脚本提供的一样。

至于你缺少的命令...根据我的基本实验,对于不涉及终端的GUI程序,它可以像先发送SIGSTOP然后SIGCONT到前台进程一样简单(kill如果你使用shell脚本来实现这一点,则使用命令) 。当然,您需要在另一个终端窗口/选项卡中运行它,困难在于以通用方式方便地找到您想要将信号发送到的 PID。默认情况下,您可以将两个信号发送到给定名称的所有进程(默认为您最喜欢的编辑器并允许使用 PID 作为参数):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

emacs在后台运行(几个)命令后,此方法正确地为我提供了终端选项卡。但由于 shell 作业控制或终端设置混乱,终端中运行的 emacs 进程未能正确恢复。因此,这种方法会受益于一些复杂性。

SIGSTOP正是您按下(默认情况下)CTRL-时发送到前台进程的内容z。参考stty -a输出

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(输出缩写)和stty手册页:

   susp CHAR
          CHAR will send a terminal stop signal

使用信号停止的进程SIGSTOP可以通过发送来重新启动SIGCONT。通常,shell 作业控制逻辑将发送SIGCONT并处理fgbg我们忽略的命令相关的其他必要操作。

相关内容