Kill:SIGSTOP:bashスクリプトの誤った信号仕様エラー

Kill:SIGSTOP:bashスクリプトの誤った信号仕様エラー

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

kill -SIGSTOP 1234

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

kill: SIGSTOP: invalid signal specification

shファイルは

#!/bin/sh
kill -SIGSTOP 1234

killBashスクリプトでどのように使用しますか?私はこれを試しました:

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

しかし、うまくいきません。

答え1

これ標準(POSIX)構文例:

kill -s STOP "$pid"

つまり、SIGプレフィックスはありません。一部のシェル実装はそれを拡張としてサポートしていますが、これは標準でも移植可能でもありませんkill -s SIGSTOPkill -SIGSTOP

UNIX仕様(POSIX + XSI)では、以下も受け入れます。

kill -STOP "$pid"

そして

kill -19 "$pid"

ただし、どのシグナル番号もSIGSTOP指定されておらず、システム間または同じシステムのアーキテクチャ間で異なる可能性があるため、避けるべきです。

答え2

私は同じ問題に直面しています。ここにある答えのどれも問題の実際の原因をカバーしていません。スクリプト内でkill使用されるものは組み込みです。シェルから提供、これがまさにエラーが発生する理由です。端末にkillある別の実行可能ファイルを使用してください/bin/kill。この問題を解決するには、/bin/killスクリプトに組み込まれているバージョンの代わりにシェルバージョンを明示的に使用する必要があります。だからあなたは次のように書いています:

#!/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

関連情報