Kill:SIGSTOP:bash 脚本中的无效信号规范错误

Kill:SIGSTOP:bash 脚本中的无效信号规范错误

当我kill在命令行上使用时它可以工作。

kill -SIGSTOP 1234

但如果我在 bash 脚本文件中使用,我会收到此错误:

kill: SIGSTOP: invalid signal specification

sh 文件是

#!/bin/sh
kill -SIGSTOP 1234

如何kill在 bash 脚本中使用?我试过这个:

#!/bin/sh
/bin/bash -c "kill -SIGSTOP 1234"

但它不起作用。

答案1

标准 (POSIX) 语法是:

kill -s STOP "$pid"

也就是说,没有SIG前缀。一些 shell 实现支持kill -s SIGSTOPkill -SIGSTOP作为扩展,但这不是标准的,也不是可移植的。

UNIX 规范 (POSIX+XSI) 还允许:

kill -STOP "$pid"

kill -19 "$pid"

虽然哪个信号编号SIGSTOP没有指定,并且可能在系统之间甚至同一系统的架构之间发生变化,因此应该避免。

答案2

我面临着同样的问题。这里的所有答案都没有解决问题的真正原因。在脚本内部kill使用的是内置的由外壳提供,这就是您出现错误的原因。在您的终端中,kill使用的是位于 的单独可执行文件/bin/kill。要解决此问题,您必须在脚本中显式使用/bin/kill而不是内置 shell 版本。因此你这样写:

#!/bin/sh
/bin/kill -s SIGHUP 14344

答案3

首先: SIGSTOP将暂时停止进程但保留在内存中,以便稍后可以使用SIGCONT系统调用继续。您可以使用以下小片段来查看会发生什么

#!/bin/bash

set -x

sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"

您将看到脚本以交互方式执行的操作。

因此,为了让你的脚本使用 shebang 工作,#/bin/sh你需要做类似的事情

#!/bin/sh

set -x
set +o posix
sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"
set -o posix

相关内容