実行権限なしでバイナリを実行しようとしたときに表示されるエラー

実行権限なしでバイナリを実行しようとしたときに表示されるエラー

正しく機能しないサードパーティのスクリプトがあります。プロセスを開始する必要があります。実行可能パスとそのパラメータは$1最初の引数()としてスクリプトに渡されます。

[...]
echo "Good ´ol printf-debugging in 2022"
echo $1
$1 &> /dev/null &
ExitStatus=$?
PID=$!
echo "PID = " $PID
echo "ExitStatus (before wait) = " $ExitStatus
wait $PID
echo "ExitStatus (after wait) = " $ExitStatus
[...]

これは以下を印刷します:

Good ´ol printf-debugging in 2022
/opt/daq-logger/daq-logger /media/sdcard/daq
PID =  493
ExitStatus (before wait) =  0

出力はここで停止します(ただしコマンドは完了します)。

$1 &> /dev/null &に変更しても$1 &出力は変わりません。 justを使用すると、$1パスを印刷した後に出力が停止し、コマンドが完了します。

1時間の間、その終わりに問題のバイナリに実行権限がないことがわかりました。rwxr--r--

エラーが表示されないのはなぜですか?エラーを表示するにはどうすればよいですか?プロセスが実際に起動しない場合、スクリプトがPIDを取得するのはなぜですか?うーん…確かに。プロセスが開始されると、そのプロセスと標準エラーはどうなりますか(つまり、なぜ見ることができないのですか?)

答え1

ラインの直後

echo "Good ´ol printf-debugging in 2022"

あなたは追加する必要があります

COM=`echo "${1}" | awk '{ print $1}' `
test -x "${COM}" || ( echo "\t ERROR:  '${COM}' is not executable! ; exit 1 )

これにより、必要な前提条件なしで呼び出しスクリプトが進行しなくなります。

そしてラインも参考にしてください

ExitStatus=$?

$ 1の終了ステータスをキャプチャしないでください。しかし、経験的には、そのコマンドラインをバックグラウンドに配置する成功/失敗はほぼ常にゼロです。バックグラウンドプロセスの実際の戻りコードを取得するには、次を参照してください。返信する

関連情報