从命令行发送信号到进程

8

我了解信号,并且知道如何从命令行向进程发送信号。只需要执行:

ps -C executable

要知道进程的pid,然后

kill -s signal pid(number)

然而,如果可能的话,我希望找到一种更互动和通用的方式来做这件事。

我想从命令行向特定进程发送信号。我不想需要打印要发信号的进程的PID,而是使用一种代码可以理解哪个进程应该被信号的方法。

除此之外,我想确切地了解kill命令的作用。

  • 它会杀死发送信号的进程吗?
  • 它会杀死调用它的进程吗?
  • 如果它杀死一个进程,那么它就像执行exit(0)一样,还是在发送信号后进程会恢复运行?

那么你希望发送信号的期望形式是什么?你能通过一个例子来具体说明吗? - Eugene Sh.
@EugeneSh。我认为在代码中运行函数的命令将是完美的。我可以轻松创建一个发送信号的函数。不过,我仍然想知道kill命令的作用。 - André Almeida
3个回答

23

据我所理解,您想通过进程名称而不是PID来标识一个进程。这可以通过结合这两个命令轻松实现:

kill -s signal $(ps -C executable)


它能否杀死发送信号的进程?

kill 命令可以 杀死进程,但不一定会这样做。

根据 man kill 的说明:

kill 命令向指定的进程或进程组发送指定的信号。

也就是说,kill 命令通常用于发送任何信号。

如果它杀死了一个进程,那么它是否类似于执行 exit(0),或者进程在发送信号后恢复?

根据这里的说明:

SIGKILL 信号用于导致程序立即终止。无法处理或忽略它,因此总是致命的。也不可能阻止该信号。

如果一个进程接收到 SIGKILL 信号,则会立即终止(不调用析构函数,不进行清理)。唯一不终止的进程是无法中断的进程。


Linux 中可用信号的完整列表请参见 此处


只要我不使用SIGKILL信号,我就可以毫无问题地使用kill命令,它不会暂停或杀死任何进程。 - André Almeida
然而,我有3个进程,所以我认为你的答案提议会向所有3个进程发送信号,而不是1个特定的进程。 - André Almeida
@AndréAlmeida kill 只发送信号。还有其他信号,如 SIGSTOPSIGTERM,可以停止/终止程序。您需要查找每个信号的功能以确保它的作用。 - cadaniluk

3

我更喜欢这个:

pkill -signal processname

这里是我时不时使用的一个具体例子:

pkill -USR1 Squeak

请参考pkill - 维基百科


0
我想从命令行向特定进程发送信号。我不想需要打印要发信号的进程的PID,而是希望使用一种代码可以理解哪个进程应该被发信号的方式。
如果您有killall命令可用,则符合这些标准。它允许您根据进程名称指定要发信号的进程。通过killall传递信号和通过kill传递信号的效果相同。
除此之外,我想了解kill命令的确切作用。
它只会传递指定的信号。有些信号可以杀死进程。
它只向您指定的进程发送信号。
如果它杀死一个进程,那么它类似于执行exit(0),还是在发送信号后进程会恢复?

进程可以在不终止的情况下处理一些信号。当进程接收到这些信号时,发生的确切情况取决于进程本身。如果一个进程没有为默认动作是终止进程的信号提供处理程序,则该进程将死亡,永远无法恢复。这种效果有点像调用 exit() 函数或从 main() 返回,但终止是突然的,而不会调用退出处理程序等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接