假设您在 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
并处理fg
与bg
我们忽略的命令相关的其他必要操作。