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

use*_*345 13 command-line bash kill

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

kill -SIGSTOP 1234
Run Code Online (Sandbox Code Playgroud)

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

kill: SIGSTOP: invalid signal specification
Run Code Online (Sandbox Code Playgroud)

.sh 文件是

#!/bin/sh
kill -SIGSTOP 1234
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
/bin/bash -c "kill -SIGSTOP 1234"
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

Sté*_*las 14

的标准(POSIX)的语法是:

kill -s STOP "$pid"
Run Code Online (Sandbox Code Playgroud)

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

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

kill -STOP "$pid"
Run Code Online (Sandbox Code Playgroud)

和

kill -19 "$pid"
Run Code Online (Sandbox Code Playgroud)

尽管SIGSTOP未指定哪个信号编号,并且可能会在系统之间甚至同一系统的体系结构之间发生变化,因此应该避免。

  • `set +o posix` 只会在 bash 以 posix 模式启动时在 bash 中允许 SIGTERM/SIGSTOP,而不是任何其他 sh 实现。所以你依赖你的 /bin/sh 是 bash。不要那样做,使用`#! /bin/bash` 如果您想使用 bash 特定功能。 (2认同)

Val*_*ami 2

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

#!/bin/bash

set -x

sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"
Run Code Online (Sandbox Code Playgroud)

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

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

#!/bin/sh

set -x
set +o posix
sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"
set -o posix
Run Code Online (Sandbox Code Playgroud)