コマンドラインで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"
しかし、それは機能しません。
最初に: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
標準(POSIX)構文 は次のとおりです。
kill -s STOP "$pid"
つまり、SIG
接頭辞がありません。一部のシェル実装、サポートkill -s SIGSTOP
またはkill -SIGSTOP
は拡張機能ですが、これは標準でも移植性でもありません。
UNIX仕様(POSIX + XSI)では、以下も許可されています。
kill -STOP "$pid"
そして
kill -19 "$pid"
どの信号番号がSIGSTOP
であるかは指定されておらず、システム間および同じシステムのアーキテクチャでさえ変更される可能性があるため、回避する必要があります。
私も同じ問題に直面しています。ここでのすべての回答は、問題の真の原因を扱っていません。スクリプト内で使用されるkill
はシェルからの組み込みであり、これがエラーの原因です。ターミナルでは、使用されるkill
は/bin/kill
にある個別の実行可能ファイルです。この問題を修正するには、スクリプト内で組み込みのシェルバージョンではなく/bin/kill
を使用する必要があります。したがって、次のように記述します。
#!/bin/sh
/bin/kill -s SIGHUP 14344