如何杀死linux中最后生成的后台任务?
例:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Run Code Online (Sandbox Code Playgroud) 除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)
我原则上同意SIGKILL,但其余的对我来说都是新闻.鉴于发送的默认信号kill是SIGTERM,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.
鉴于这SIGKILL是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?
如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.
注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.
编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?
在脚本中你没有工作控制(并试图打开它是愚蠢的)
这是我第一次听到这个,而且我仔细考虑了关于工作控制的bash.info部分(第7章),没有提到这些断言中的任何一个.[ 更新:手册页稍好一些,提到'典型'使用,默认设置和终端I/O,但没有真正的理由说明为什么作业控制对于脚本来说特别不明智.
那么为什么基于脚本的作业控制不起作用,又是什么使它成为一种不好的做法(又名"愚蠢")?
编辑:有问题的脚本启动一个后台进程,启动第二后台进程,然后试图将所述第一进程返回到前景,以便它具有普通端子I/O(如如果直接运行),然后可以被重定向从在剧本之外.不能这样做到后台进程.
正如另一个问题的已接受答案所指出的,存在其他脚本可以在不尝试作业控制的情况下解决该特定问题.精细.lambasted脚本使用硬编码的作业号 - 显然很糟糕.但我试图了解工作控制是否是一种根本注定失败的方法.它似乎仍然可以工作......
为了最大化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)
我对这个工作解决方案非常满意,但是我无法弄清楚如何编写进一步的代码,只有在所有循环完成后才执行.
有没有办法控制这个?
如何运行shell脚本并立即对其进行后台处理,但是可以通过拖尾/tmp/output.txt随时检查其输出
如果我能在以后进行前瞻,那将是很好的.
PS如果您还可以向我展示如何将后台进程"发送"到可能已初始化或未初始化的gnu屏幕,那将是非常酷的.
我有一个嵌入式系统,我在其上telnet运行,然后在后台运行一个应用程序:
./app_name &
Run Code Online (Sandbox Code Playgroud)
现在如果我关闭我的终端并telnet从其他终端做,如果我检查然后我可以看到这个过程仍在运行.
为了检查这个,我写了一个小程序:
#include<stdio.h>
main()
{
while(1);
}
Run Code Online (Sandbox Code Playgroud)
我在后台运行我的本地linux pc程序,然后我关闭了终端.
现在,当我从其他终端检查这个过程时,我发现这个过程也被杀死了.
我的问题是:
当我在PowerShell中按Ctrl+ C时,我会收到:
终止批处理作业(是/否)?
与https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation类似,但Windows PowerShell除外.
PowerShell是否提供了比CMD更多的批处理作业控制?
我有一个过程是这样的:
但是,每次背景和前景vim时,bash / zsh都会打印两条如下所示的消息:
[1] + 4321 continued nvim
[1] + 4321 suspended nvim
Run Code Online (Sandbox Code Playgroud)
这些很烦人,因为它们占用了屏幕空间,最终结果过滤掉了屏幕。我必须重新运行该命令或连续上下滚动才能找到它。
有没有一种方法可以获取“续/挂起”消息以避免添加太多换行符?或者,我可以完全压制它们吗?
当直接通过内核选项以pid 1bash调用时init=/bin/bash --login时,它会在提示之前发出类似这样的信息:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device\nbash: no job control in this shell\nRun Code Online (Sandbox Code Playgroud)\n和键盘生成的信号(例如 ^Z、^C、^\\)不起作用。
\n为了解决这个问题,我写了一个简单的程序init1.c如下:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device\nbash: no job control in this shell\nRun Code Online (Sandbox Code Playgroud)\n将其编译为init1,然后将其作为pid 1调用(即 Bash 作为pid 1运行),前面的错误消息消失并且某些信号(例如 ^C、^\\)起作用,但作业控制信号(例如 ^Z)仍然不起作用(意外)。
因此,为了使作业控制信号起作用,我将上面的代码修改为init2.c(只是fork()):
/* 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) 假设pid X是一个进程组负责人并X终止,但进程组中的其他进程仍在运行(X作为他们的pgid).Linux会阻止将值X指定为新进程的pid吗?
我问这是因为POSIX允许的失败条件setsid:
[EPERM]调用进程已经是进程组负责人,或者调用进程以外的进程的进程组ID与调用进程的进程ID匹配.
对于使用将"随机"触发的进程组(即shell)的代码,此错误似乎是一个不可恢复的条件,使其更加可恶.我认为任何旨在达到理智水平的实现都会避免重新分配X为pid,而它仍然被用作pgid,但我无法在任何地方找到它.
job-control ×10
bash ×6
linux ×4
c ×2
shell ×2
signals ×2
daemon ×1
foreground ×1
gnu-screen ×1
kill ×1
node.js ×1
posix ×1
powershell ×1
scripting ×1
sigterm ×1
telnet ×1
unix ×1
vim ×1
zsh ×1