web-dev-qa-db-ja.com

kill:SIGSTOP:bashスクリプトの無効な信号指定エラー

コマンドラインでkillを使用すると機能します。

kill -SIGSTOP 1234

しかし、bashスクリプトファイルで使用すると、次のエラーが発生します。

kill: SIGSTOP: invalid signal specification

shファイルは

#!/bin/sh
kill -SIGSTOP 1234

Bashスクリプトでkillを使用するにはどうすればよいですか?私はこれを試しました:

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

しかし、それは機能しません。

7
user4757345

最初に:SIGSTOPはプロセスを一時的に停止しますが、メモリに保持するため、後でSIGCONTシステムコールを使用して続行できます。次の小さなスニペットを使用して、何が起こるかを確認できます

#!/bin/bash

set -x

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

スクリプトが対話的に行うことを確認します。

したがって、#/bin/sh Shebangを使用してスクリプトを機能させるには、次のようにします。

#!/bin/sh

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

標準(POSIX)構文 は次のとおりです。

kill -s STOP "$pid"

つまり、SIG接頭辞がありません。一部のシェル実装、サポートkill -s SIGSTOPまたはkill -SIGSTOPは拡張機能ですが、これは標準でも移植性でもありません。

UNIX仕様(POSIX + XSI)では、以下も許可されています。

kill -STOP "$pid"

そして

kill -19 "$pid"

どの信号番号がSIGSTOPであるかは指定されておらず、システム間および同じシステムのアーキテクチャでさえ変更される可能性があるため、回避する必要があります。

11

私も同じ問題に直面しています。ここでのすべての回答は、問題の真の原因を扱っていません。スクリプト内で使用されるkillはシェルからの組み込みであり、これがエラーの原因です。ターミナルでは、使用されるkill/bin/killにある個別の実行可能ファイルです。この問題を修正するには、スクリプト内で組み込みのシェルバージョンではなく/bin/killを使用する必要があります。したがって、次のように記述します。

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