如果我开始一个进程并在终端窗口中将其作为后台(比如ping google.com &),我可以使用kill %1(假设它是作业 1)来终止它。
但是,如果我打开另一个终端窗口(或选项卡),后台进程不会在下面列出jobs并且不能直接使用kill.
是否可以从另一个终端窗口或选项卡中终止此进程?
注意:我正在使用 Xfce Terminal Emulator 0.4.3 和 bash(尽管如果解决方案存在于另一个通用 shell 中但不是 bash,我也愿意接受)
我在 RHEL6 bash 提示符下看到一些奇怪的行为。我经常喜欢执行看起来像……的命令行。
$ ./myscript > junk 2>&1
Run Code Online (Sandbox Code Playgroud)
...然后点击 ^Z 然后执行 ...
$ bg
$ tail -f junk
blah blah blah blah
blah blah blah blah
Run Code Online (Sandbox Code Playgroud)
但是今天出于某种原因,我看到我的工作保持“停止”状态,而不是“运行”状态。
$ uname -a
Linux myhost 2.6.18-371.11.1.el5 #1 SMP Mon Jun 30 04:51:39 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
$ ./myscript.sh > output-07-JUL-16.txt 2>&1
^Z
[1]+ Stopped ./myscript.sh > output-07-JUL-16.txt 2>&1
$ bg
[1]+ ./myscript.sh > output-07-JUL-16.txt 2>&1 &
$ jobs
[1]+ …Run Code Online (Sandbox Code Playgroud) jobs是我最喜欢的命令,用于查看我在后台运行的代码。为了动态检查它们,我倾向于键入
watch 'jobs'
Run Code Online (Sandbox Code Playgroud)
它不显示任何内容。然而
watch 'ps'
Run Code Online (Sandbox Code Playgroud)
完美地工作。几个月来我一直在犯同样的错误。
我认为理解为什么第一个不起作用而第二个起作用可以帮助我停止犯同样的错误。
任何人都可以帮忙吗?
我要做的是:
sleep 5
Run Code Online (Sandbox Code Playgroud)
并立即CTRL-Z所以当我打开时,jobs我看到:
[1]+ Stopped sleep 5
Run Code Online (Sandbox Code Playgroud)
接下来,当我执行fg %1sleep 过程不再运行时,它已完成,这意味着它在运行 5(也许 4?)秒的同时运行Stopped。为什么?
我们可以发出CTRL+Z暂停 Unix 中的任何作业,然后使用fg或使它们恢复生机bg。我想了解那些像这样被暂停的工作会发生什么?他们被杀死/终止了吗?换句话说,杀死和暂停进程有什么区别?
我在使用分号分隔的命令行上运行多个命令:
cmd1; cmd2; cmd3
如果我在上面按Ctrl+ C,它会杀死所有命令,而不仅仅是当前正在执行的命令。
kartik@kartikpc:~/junk/exp$ ls
test1 test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running
cat is running
^C
kartik@kartikpc:~/junk/exp
Run Code Online (Sandbox Code Playgroud)
但是Ctrl+Z只会暂停当前进程并继续下一个进程。
kartik@kartikpc:~/junk/exp$ ls
test1 test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running
cat is running
^Z
[1]+ Stopped cat
test1 test2
kartik@kartikpc:~/junk/exp$
Run Code Online (Sandbox Code Playgroud)
为什么行为存在差异,有没有办法让Ctrl+C表现得像Ctrl+ Z?
我实际上是通过 tmux 会话运行服务器,如下所示node app.js; $bash,当我执行Ctrl+C来杀死服务器时,它也会杀死 bash。我想回到贝壳。有没有其他选择来实现我想要的行为?
[更新]
tcsh与Ctrl+C和Ctrl+ 的行为相同 …
是否可以使用该ps命令列出所有正在运行的后台进程,或者是获取该命令后台进程列表的唯一选项jobs?
如果我找到disown一份工作bash并改变主意,我可以以某种方式撤消它吗?
如果是这样,更进一步,是否可以将任意流程置于作业控制之下(可接受的限制是我拥有该流程)?
最后,这是否会使以下工作流程成为可能:
^z后跟bg)jobs -p %+获取它的<pid>)screen或tmux会话,附加到它并将其用于以下步骤reptyr抢的作业(reptyr <pid>)<pid>到 shell 的作业控制(这可能吗?)^Z)除了最后两步,我什么都能做。停止作业^Z不起作用,因为该进程不在 shell 的作业列表中。
我的研究表明不可能拥有(反向disown)一个 pid 但希望我错了......
我对通过 kill 命令使用百分号来停止工作感到困惑。我在 kill 的手册页中找不到任何表明可以使用百分号的文档。有人可以向我解释这个解释是否隐藏在其他地方,或者为什么使用这个%标志?
kill -s 19 %1 将停止 ID 为 1 的作业
我可以grep输出jobs,我可以grep输出 a function。但是为什么我不能jobs在函数中grep 输出呢?
$ # yes, i can grep jobs
$ jobs
[1]+ Running vim
[2]+ Stopped matlab
$ jobs | grep vim
[1]+ Running vim
$ # yes, of course i can grep a function
$ type mockjobs
mockjobs is a function
mockjobs ()
{
echo '[1]+ Running vim banjo'
}
$ mockjobs | grep vim
[1]+ Running vim banjo
$ # now put those two together and surely …Run Code Online (Sandbox Code Playgroud)