質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

バックグラウンド実行シェルの出力も受け取る

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,736

score 13

1.実現したいこと

以下のpythonコードでAシェルを動かしながらBシェルの出力をpythonで受け取ろうとしています。

Loc="string"
Linuxcmd = ["$0 $1","sh ./F.sh",Loc]
print("Please wait.....")
subprocess.run(Linuxcmd,shell=True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)

2.実行スクリプト

F.shは以下。

#!/bin/bash

HOSTS="host1
host2"

sh ./B.sh &

for i in ${HOSTS};do

ssh -o StrictHostKeyChecking=no $i "df -h --portability | grep -E '\ /$'"  1>> ${dir}/Result/result.csv  2>${dir}/error/${i}_error.csv

done

B.shは以下

#!/bin/bash


File=`pwd`"/Result/restlt.csv"
echo ${cmd}

Total=7

while :
do
  Cnt=`wc -l ${File} | awk '{print $1}'` >/dev/null 2>&1
  Pro=`ps -ef | grep "GetLogs.sh " | \grep -v grep | wc -l` >/dev/null 2>&1

if [ ${Pro} = 1 ] ; then
Per=`echo "scale=3;${Cnt}/${Total}*100" | bc`
date;echo ${Per}"% completed...."

else
break
fi

sleep 5

done

F.shをPythonを介さずに実行すると
date;echo ${Per}"% completed...."
が問題なく画面出力するのですが、
Pythonから実行すると上記の出力がされることなく終了してしまいます。

Popen.communicate()でもトライしてみましたが
戻り値が空っぽ(NONE)でした。
バックグラウンド実行の出力は標準出力ではないのでしょうか?
どうしたら表示されますでしょうか。

アドバイスいただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2019/10/02 16:24

    私自身確認していないのであれですが、次のURLは参考になりませんか?
    https://stackoverflow.com/questions/41542960/run-interactive-bash-with-popen-and-a-dedicated-tty-python

    キャンセル

  • otn

    2019/10/02 16:40

    pythonコードにプロセスのstdoutを表示する部分が含まれていませんが?

    キャンセル

  • stweoigh

    2019/10/02 17:47

    >t_obara
    ご回答ありがとうございます。
    こちらはttyを操作するためのスクリプトのようなので
    今回のエラーとは少し違うようです。

    >otn
    コメントありがとうございます。
    stdoutを表示するコードが
    ``stdout = subprocess.PIPE``だと思っていたのですが
    勘違いでしたらご教授いただけると幸いです・・・。

    キャンセル

  • otn

    2019/10/02 18:13

    違います。それは、「コマンド実行のstdoutをパイプに書け」と言う事です。パイプを読んで書く処理が必要です。

    キャンセル

回答 1

check解決した方法

0

結局pipeをwriteして表示させても空っぽ。。
ということで再考しpython内でF.shで実行していたsshコマンドと
b.shで実行していた進捗表示を全て行うことにしました。
tqdmという便利なライブラリがあったのでこちらを使用。

参考:https://blog.amedama.jp/entry/2018/07/23/080000
https://qiita.com/pontyo4/items/76145cb10e030ad8186a

HOSTS=["HOST_A","HOST_B"]
RMcmd="uname -a" ##SSH接続先で実行すること
csv=RESULTS.csv
logfile = open(csv, 'w') ##logfileを作る

CNT=0
pbar = tqdm(total=len(HOSTS))

while CNT < len(HOSTS):

    for host in HOSTS:

        Loccmd = ("ssh -o StrictHostKeyChecking=no {}  '{}'".format(host,RMcmd))

        proc=subprocess.Popen(shlex.split(Loccmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)


        with open(csv, 'a') as f:

            for line in proc.stdout:
                errorfile = open(str(PyPath)+'/error/'+host+'_error.csv', 'w') #ホスト毎にエラーファイルを作成
                f.write(str(line.decode('utf-8'))) #標準出力
                errorfile.write(str(proc.stderr)) #標準エラー出力
                proc.wait()    

        CNT +=1
        pbar.update(1)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る