假设您在Linux中启动了一个新应用程序(例如文本编辑器等),但是却忘记了使用“&”。您将使用什么命令来使该进程在后台运行,而不必关闭该应用程序?这样,您就可以同时打开和运行两个进程(例如,用于创建进程的命令行终端,以及诸如文本编辑器之类的进程仍在运行。
假设您在Linux中启动了一个新应用程序(例如文本编辑器等),但是却忘记了使用“&”。您将使用什么命令来使该进程在后台运行,而不必关闭该应用程序?这样,您就可以同时打开和运行两个进程(例如,用于创建进程的命令行终端,以及诸如文本编辑器之类的进程仍在运行。
Answers:
Ctrl+ Z是执行此操作的方法,但仅出于完整性考虑:该问题要求“命令”,这将是(来自另一个终端):
kill -STOP pid_of_the_running_applications
然后当然
bg
从应用程序终端。
在Bash中:
Ctrl+ Z然后bg
。
现在运行jobs
并查看结果。
/bin/sh
因此无法使用:-)
为了避免按下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
我们会忽略这些命令。
tmux
提供与您的问题所需的功能相同的功能。