标签: signals

当我 Ctrl+C 时,如何杀死并等待后台进程在 shell 脚本中完成?

我正在尝试设置一个 shell 脚本,以便它运行后台进程,当我Ctrlc使用 shell 脚本时,它会杀死孩子,然后退出。

我设法想出的最好的就是这个。似乎kill 0 -INT在等待发生之前也杀死了脚本,所以 shell 脚本在孩子们完成之前就死了。

关于如何让这个 shell 脚本在发送后等待孩子们死亡的任何想法INT

#!/bin/bash
trap 'killall' INT

killall() {
    echo "**** Shutting down... ****"
    kill 0 -INT
    wait # Why doesn't this wait??
    echo DONE
}

process1 &
process2 &
process3 &

cat # wait forever
Run Code Online (Sandbox Code Playgroud)

shell bash kill signals job-control

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

当您尝试永久终止一个进程时,您应该使用哪个“kill”选项?

我从人们那里收到了很多混合的信息,并且想知道您使用的内容是否真的没有太大区别。

kill 'x'
killall 'x'
kill -9 'x'
Run Code Online (Sandbox Code Playgroud)

这些是到目前为止我被告知要使用的一些选项,但有些人说 kill -9 只是矫枉过正,kill 本身不起作用,等等。

有没有人对在终止进程(及其状态)的最标准情况下应该使用哪一个有任何建议?

[编辑] 我正在寻找当您想停止流程执行时要使用的内容,以便您可以从一开始就运行一个新流程

process kill signals

26
推荐指数
2
解决办法
2616
查看次数

为什么我不能用 SIGTERM 杀死一个 SIGSTOP 的进程,挂起的信号存储在哪里?

我正在使用 Debian 伸展 (systemd)。我在前台使用运行 rsyslog 守护进程 /usr/sbin/rsyslogd -n ,我做了一个Ctrl+Z来停止它。进程状态更改为Tl(已停止、已线程)。我向进程发出了多个命令,进程的状态是相同的:. 一旦我做了一个,它就死了。我有3个问题。kill -15 <pid>Tlfg

  • 为什么SIGSTOP-ed 进程没有响应SIGTERM?为什么内核让它保持在相同的状态?
  • 为什么它在收到SIGCONT信号的那一刻就被杀死了?
  • 如果是因为之前的SIGTERM信号,那么在进程恢复之前它会保存在哪里?

process kill signals

26
推荐指数
2
解决办法
7698
查看次数

进程后代

我正在尝试构建一个流程容器。容器会触发其他程序。例如 - 使用 '&' 启动运行后台任务的 bash 脚本。

我所追求的重要特性是:当我杀死容器时,它下面产生的所有东西都应该被杀死。不仅是直系子女,还有他们的后代。

当我开始这个项目时,我错误地认为当你杀死一个进程时,它的孩子也会自动被杀死。我曾向有同样错误想法的人寻求建议。虽然有可能捕捉到信号并将杀戮传递给儿童,但这不是我在这里要寻找的。

我相信我想要实现的目标,因为当你关闭一个 xterm 时,它里面运行的任何东西都会被杀死,除非它被 nohup'd。这包括孤立进程。这就是我想要重新创建的。

我有一个想法,我正在寻找的内容涉及 unix 会话。

如果有一种可靠的方法来识别进程的所有后代,那么能够向它们发送任意信号也会很有用。例如SIGUSR1。

process signals fork container

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

如何让 `xargs` 忽略孩子的退出并继续进一步处理

我有时会在xargs一夜之间运行很长时间的工作,并且在早上发现xargs中间某个地方死了真的很烦人,例如因为在一个特殊情况下的分段错误,就像今晚发生的那样。

即使一个xargs孩子被杀死,它也不会处理任何更多的输入:

控制台 1:

[09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";'
xargs: bash: terminated by signal 15
09:35:58 3
09:35:58 4
09:35:58 2
<Exit with code 125>
Run Code Online (Sandbox Code Playgroud)

控制台 2:

[09:35:54] kill 5601
Run Code Online (Sandbox Code Playgroud)

xargs一旦子进程终止并继续处理,我能否以某种方式阻止停止处理更多输入?

kill signals xargs

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

bash `suspend` 内置命令的目的是什么?

我输入help suspend并得到了这个简短的解释:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.
Run Code Online (Sandbox Code Playgroud)

我的理解是:我输入suspend并且终端冻结,甚至 strg + c 也无法解冻它。但是,当我打开另一个终端并搜索冻结终端的 PID 并键入kill -SIGCONT PID-NR一个 SIGCONT 信号时,它会发送到冻结终端并将其解冻,使其解冻。

但是,暂停终端的实际目的是什么?哪些日常应用是它的典型应用?让它成为内置 shell 的人有什么想法?

bash signals suspend shell-builtin

25
推荐指数
2
解决办法
6371
查看次数

为什么在 Linux 中输入 Ctrl+c 两次会停止正在运行的进程?

有一些 Linux 程序,例如 vlc,如果程序在第一个之后没有停止,则建议键入ctrl+c两次以从终端终止它们的执行。

为什么在第一次不起作用时键入ctrl+c两次会起作用?

kill signals

24
推荐指数
2
解决办法
5632
查看次数

如何通过终端软杀死 gui 应用程序?

有没有办法以友好的“请立即退出”方式关闭 GUI 应用程序,而无需对应用程序窗口进行图形访问?

例如,如果 Gnome/X 显示器崩溃为黑色,我想切换到 tty2 并关闭像 firefox 这样的应用程序,让它们保存配置等。最好不要进一步的用户查询。

command-line kill gui signals

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

获取 ssh 转发信号

我希望能够通过 ssh 发送信号(SIGINT 是最重要的)。

这个命令:

ssh server "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)

将在服务器上开始睡眠,并在 1000 秒后将 'f\n' 放在我本地机器上的文件 foo 中。如果我按 CTRL-C(即向 ssh 发送 SIGINT),它将终止 ssh,但不会终止远程服务器上的 sleep。我希望它杀死远程服务器上的睡眠。

所以我试过:

ssh server -t "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)

但如果 stdin 不是终端,我会收到此错误:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Run Code Online (Sandbox Code Playgroud)

然后 SIGINT 仍然没有转发。

所以我试过:

ssh server -t -t "sleep 1000;echo f" > output
Run Code Online (Sandbox Code Playgroud)

但是 foo 中的输出不是 'f\n' 而是 'f\r\n' 这在我的情况下是灾难性的(因为我的输出是二进制数据)。

在上面我使用“sleep 1000;echo f”,但实际上它是由用户提供的,因此它可以包含任何内容。然而,如果我们可以让它适用于“sleep 1000;echo f”,我们很可能让它适用于所有现实情况。

我真的不关心在另一端获得伪终端,但我一直无法找到任何其他方式让 ssh 转发我的 SIGINT。

还有其他方法吗?

编辑:

用户可以给出从 …

ssh remote signals tty

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

杀死挂起的进程?

我有点困惑:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp
Run Code Online (Sandbox Code Playgroud)

所以我辞职只是“自己做”,后来想知道为什么:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%
Run Code Online (Sandbox Code Playgroud)

哦!

确实有道理,现在我想起来了,它vim必须运行才能让它的信号处理程序被告知退出,并这样做。

但显然不是我想要的。

有没有办法在单个命令中“唤醒和退出”?即,内置别名kill %N && fg %N

为什么在后台恢复不起作用?如果 Ibg而不是fg,Vim 会一直活着直到 I …

kill signals process-management background-process

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