没有“&”的后台处理


24

假设您在Linux中启动了一个新应用程序(例如文本编辑器等),但是却忘记了使用“&”。您将使用什么命令来使该进程在后台运行,而不必关闭该应用程序?这样,您就可以同时打开和运行两个进程(例如,用于创建进程的命令行终端,以及诸如文本编辑器之类的进程仍在运行。


从技术上讲,不是但可以tmux提供与您的问题所需的功能相同的功能。
mkc

1
不要忽略在可能的情况下打开另一个外壳的简单选择。
jpmc26 2016年

Answers:


43

在终端窗口中,通常将键入Control+ Z以“挂起”该过程,然后使用bg命令将其“后台”。

例如带有睡眠命令

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

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


5
可能有趣的是,可以使用fg命令将进程带回前台,该命令将作业ID(1在本例中,用括号指定)作为参数。它不是特定于的使用,bg可以在用启动的进程上完成&
亚伦

14

Ctrl+ Z是执行此操作的方法,但仅出于完整性考虑:该问题要求“命令”,这将是(来自另一个终端):

kill -STOP pid_of_the_running_applications

然后当然

bg

从应用程序终端。


6
kil -STOP,然后杀死-CONT
Michel Billaud,

10

在Bash中:

Ctrl+ Z然后bg

现在运行jobs并查看结果。


2
@grooveplex托马斯首先回答,因此在斯蒂芬的回答下方评论是更合适的,因为他基本上是托马斯的答案,但有更多细节。
Anthon

2
我们实际上同时回答。毫无疑问,我们俩都说了同样的话,因为这是显而易见的答案:-)我们俩都没有抄袭对方。我的答案在Thomas'之后不久就到了,因为我花了更多的时间来创建和格式化示例。
史蒂芬·哈里斯

1
我的说是在Bash中,所以他们不一样。
Tomasz

1
嘿,那里有一个潜在的问题。它确实需要外壳具有作业控制权。我使用过的第一批计算机(基于SVr2)没有安装,/bin/sh因此无法使用:-)
Stephen Harris

1

为了避免按下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我们会忽略这些命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.