プログラムが呼び出すPythonスクリプトで呼び出されるbashスクリプトの問題を解決するには?

プログラムが呼び出すPythonスクリプトで呼び出されるbashスクリプトの問題を解決するには?

Ubuntu 18.04で実行されているプログラムで呼び出されるPythonスクリプトで呼び出されるこのbashスクリプトの問題を解決する必要があります。

Pythonスクリプトとプログラムはブラックボックスです。私が持っている唯一の情報はうまくいき、スクリプト自体が失敗するので、bashスクリプトを呼び出すときにのみPythonスクリプトが失敗するということです。

bashスクリプトは非常に単純で、それ自体はうまく機能しますが、このスクリプトから呼び出すたびに失敗するので、ある種の権限エラーがあると思います。問題は、失敗したときに表示されるエラーメッセージを取得する方法を見つける必要があることです。この場合、この情報をどのように取得できますか?

Pythonスクリプトでbashスクリプトを実行すると、端末に何も出力されませんset -xset -v

以下はbashスクリプトの内容です。

#!/bin/bash

echo "$1" >> /scripts/vomit
mv $1/*.mp4 .

問題行はですmv $1/*.mp4。その行をコメントアウトすると、プログラムで呼び出されたPythonスクリプト内で呼び出されたときにスクリプトが機能します。私は知りません。なぜmvラインに問題があります。

答え1

使用straceプログラムとすべての子プロセスをデバッグするためのコマンド。

新しいプロセスの場合:

strace -f command

既存のプロセスの場合:

strace -fp PID

プロセスIDがわからない場合(実行が速すぎるため)、シェルスクリプトの先頭にsleep 20プロセスIDを追加してそのPIDを見つける時間を確保し、見つけたps wuax | grep bashPIDと一緒に上記のコマンドを使用できます。

出力をフィルタリングするにはを使用します-e。ファイルに保存するにはを使用します。-oメッセージサイズを増やすには、を使用してください-sman strace

より良い形式については、以下を参照してください。シェルでstraceをプレーンテキストに解析する方法は?


これは実用的な例です。次のmyscript.shファイルが提供されます。

#!/bin/bash -x
echo "$1"

次のコマンドを実行しました。

strace -f -e trace=execve,read,write -s1000 bash -x ./myscript.sh foo bar

次の出力が生成されます。

execve("/bin/bash", ["bash", "-x", "./myscript.sh", "foo", "bar"], [/* 41 vars */]) = 0
...
read(3, "#!/bin/bash -x\necho \"$1\"\n", 80) = 25
read(255, "#!/bin/bash -x\necho \"$1\"\n", 25) = 25
write(2, "+ echo foo\n", 11+ echo foo
)            = 11
write(1, "foo\n", 4foo
)                    = 4
read(255, "", 25)                       = 0
+++ exited with 0 +++

答え2

端末に何も表示されない場合は、出力をファイルにリダイレクトできます。

スクリプト全体(すべての出力)をファイルに入れます(Pythonで変更)。

./script.sh &> output.log

単一コマンドの場合:

mv -v $1/*.mp4 . 2> errors.log

.set -x#!/bin/bash -x


すべてのstdoutとstderrをファイルにリダイレクトするには、以下を参照してください。Bashからのstderrとstdoutのリダイレクト、今すぐ:

# Close STDOUT file descriptor
exec 1<&-
# Close STDERR FD
exec 2<&-

# Open STDOUT as $LOG_FILE file for read and write.
exec 1<> output.log

# Redirect STDERR to STDOUT
exec 2>&1

関連情報