Ubuntu 18.04で実行されているプログラムで呼び出されるPythonスクリプトで呼び出されるこのbashスクリプトの問題を解決する必要があります。
Pythonスクリプトとプログラムはブラックボックスです。私が持っている唯一の情報はうまくいき、スクリプト自体が失敗するので、bashスクリプトを呼び出すときにのみPythonスクリプトが失敗するということです。
bashスクリプトは非常に単純で、それ自体はうまく機能しますが、このスクリプトから呼び出すたびに失敗するので、ある種の権限エラーがあると思います。問題は、失敗したときに表示されるエラーメッセージを取得する方法を見つける必要があることです。この場合、この情報をどのように取得できますか?
Pythonスクリプトでbashスクリプトを実行すると、端末に何も出力されませんset -x
。set -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 bash
PIDと一緒に上記のコマンドを使用できます。
出力をフィルタリングするにはを使用します-e
。ファイルに保存するにはを使用します。-o
メッセージサイズを増やすには、を使用してください-s
。man 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