标签: job-control

linux:杀死后台任务

如何杀死linux中最后生成的后台任务?

例:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Run Code Online (Sandbox Code Playgroud)

unix linux bash kill job-control

188
推荐指数
4
解决办法
15万
查看次数

我应该以什么顺序发送信号以正常关闭进程?

评论这个答案的另一个问题,该评论说:

除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)

我原则上同意SIGKILL,但其余的对我来说都是新闻.鉴于发送的默认信号killSIGTERM,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.

鉴于这SIGKILL是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?

如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.

注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.

编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?

bash signals job-control sigterm

80
推荐指数
4
解决办法
2万
查看次数

为什么我不能在bash脚本中使用作业控制?

这个回答另一个问题,有人告诉我,

在脚本中你没有工作控制(并试图打开它是愚蠢的)

这是我第一次听到这个,而且我仔细考虑了关于工作控制的bash.info部分(第7章),没有提到这些断言中的任何一个.[ 更新:手册页稍好一些,提到'典型'使用,默认设置和终端I/O,但没有真正的理由说明为什么作业控制对于脚本来说特别不明智.

那么为什么基于脚本的作业控制不起作用,又是什么使它成为一种不好的做法(又名"愚蠢")?

编辑:有问题的脚本启动一个后台进程,启动第二后台进程,然后试图将所述第一进程返回到前景,以便它具有普通端子I/O(如如果直接运行),然后可以被重定向从在剧本之外.不能这样做到后台进程.

正如另一个问题的已接受答案所指出的,存在其他脚本可以在不尝试作业控制的情况下解决该特定问题.精细.lambasted脚本使用硬编码的作业号 - 显然很糟糕.但我试图了解工作控制是否是一种根本注定失败的方法.它似乎仍然可以工作......

bash job-control

49
推荐指数
4
解决办法
4万
查看次数

等待脚本中的bash后台作业完成

为了最大化CPU使用率(我在EC2中的Debian Lenny上运行)我有一个简单的脚本来并行启动作业:

#!/bin/bash

for i in apache-200901*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200902*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200903*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200904*.log; do echo "Processing $i ..."; do_something_important; done &
...
Run Code Online (Sandbox Code Playgroud)

我对这个工作解决方案非常满意,但是我无法弄清楚如何编写进一步的代码,只有在所有循环完成后才执行.

有没有办法控制这个?

bash scripting job-control

49
推荐指数
4
解决办法
3万
查看次数

运行一个shell脚本并立即对其进行后台处理,但是要保持检查其输出的能力

如何运行shell脚本并立即对其进行后台处理,但是可以通过拖尾/tmp/output.txt随时检查其输出

如果我能在以后进行前瞻,那将是很好的.

PS如果您还可以向我展示如何将后台进程"发送"到可能已初始化或未初始化的gnu屏幕,那将是非常酷的.

bash daemon gnu-screen background-process job-control

21
推荐指数
3
解决办法
2万
查看次数

如果我们关闭它已经启动的终端,linux会杀死后台进程吗?

我有一个嵌入式系统,我在其上telnet运行,然后在后台运行一个应用程序:

./app_name &
Run Code Online (Sandbox Code Playgroud)

现在如果我关闭我的终端并telnet从其他终端做,如果我检查然后我可以看到这个过程仍在运行.

为了检查这个,我写了一个小程序:

#include<stdio.h>
main()
{
    while(1);
}
Run Code Online (Sandbox Code Playgroud)

我在后台运行我的本地linux pc程序,然后我关闭了终端.

现在,当我从其他终端检查这个过程时,我发现这个过程也被杀死了.

我的问题是:

  • 为什么相同类型的进程的未定义行为?
  • 它依赖于哪个?
  • 它是否依赖于Linux的版本?

linux shell telnet job-control

20
推荐指数
4
解决办法
1万
查看次数

如何在PowerShell中禁止"终止批处理作业(Y/N)"确认?

当我在PowerShell中按Ctrl+ C时,我会收到:

终止批处理作业(是/否)?

https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation类似,但Windows PowerShell除外.

PowerShell是否提供了比CMD更多的批处理作业控制?

powershell job-control node.js

16
推荐指数
2
解决办法
4224
查看次数

背景和前景bash / zsh作业,而无需在“续/挂起”消息中添加换行符

我有一个过程是这样的:

  • 运行一个在一堆文件中生成一堆结果的命令
  • 在vim中打开文件
  • 编辑结果之一
  • 背景vim,获取下一个结果,前景vim
  • 重复直到列表完成

但是,每次背景和前景vim时,bash / zsh都会打印两条如下所示的消息:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim
Run Code Online (Sandbox Code Playgroud)

这些很烦人,因为它们占用了屏幕空间,最终结果过滤掉了屏幕。我必须重新运行该命令或连续上下滚动才能找到它。

有没有一种方法可以获取“续/挂起”消息以避免添加太多换行符?或者,我可以完全压制它们吗?

vim bash zsh foreground job-control

12
推荐指数
2
解决办法
314
查看次数

当 Bash 作为 PID 1 运行时,为什么前台作业会忽略作业控制信号?

当直接通过内核选项以pid 1bash调用时init=/bin/bash --login时,它会在提示之前发出类似这样的信息:

\n
bash: cannot set terminal process group (-1): Inappropriate ioctl for device\nbash: no job control in this shell\n
Run Code Online (Sandbox Code Playgroud)\n

键盘生成的信号(例如 ^Z、^C、^\\)不起作用。

\n

为了解决这个问题,我写了一个简单的程序init1.c如下:

\n
bash: cannot set terminal process group (-1): Inappropriate ioctl for device\nbash: no job control in this shell\n
Run Code Online (Sandbox Code Playgroud)\n

将其编译为init1,然后将其作为pid 1调用(即 Bash 作为pid 1运行),前面的错误消息消失并且某些信号(例如 ^C、^\\)起作用,但作业控制信号(例如 ^Z)仍然不起作用(意外)。

\n

因此,为了使作业控制信号起作用,我将上面的代码修改为init2.c(只是fork()):

\n
/* init1.c */\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include …
Run Code Online (Sandbox Code Playgroud)

c linux shell signals job-control

11
推荐指数
1
解决办法
1219
查看次数

Linux是否允许将进程组ID重新分配给进程?

假设pid X是一个进程组负责人并X终止,但进程组中的其他进程仍在运行(X作为他们的pgid).Linux会阻止将值X指定为新进程的pid吗?

我问这是因为POSIX允许的失败条件setsid:

[EPERM]调用进程已经是进程组负责人,或者调用进程以外的进程的进程组ID与调用进程的进程ID匹配.

对于使用将"随机"触发的进程组(即shell)的代码,此错误似乎是一个不可恢复的条件,使其更加可恶.我认为任何旨在达到理智水平的实现都会避免重新分配X为pid,而它仍然被用作pgid,但我无法在任何地方找到它.

c linux posix job-control process-group

9
推荐指数
2
解决办法
772
查看次数