🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3854閲覧

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

stweoigh

総合スコア13

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2019/10/02 06:02

編集2019/10/02 06:20

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

Python

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

##2.実行スクリプト
F.shは以下。

Shell

1#!/bin/bash 2 3HOSTS="host1 4host2" 5 6sh ./B.sh & 7 8for i in ${HOSTS};do 9 10ssh -o StrictHostKeyChecking=no $i "df -h --portability | grep -E '\ /$'" 1>> ${dir}/Result/result.csv 2>${dir}/error/${i}_error.csv 11 12done 13

B.shは以下

Shell

1#!/bin/bash 2 3 4File=`pwd`"/Result/restlt.csv" 5echo ${cmd} 6 7Total=7 8 9while : 10do 11 Cnt=`wc -l ${File} | awk '{print $1}'` >/dev/null 2>&1 12 Pro=`ps -ef | grep "GetLogs.sh " | \grep -v grep | wc -l` >/dev/null 2>&1 13 14if [ ${Pro} = 1 ] ; then 15Per=`echo "scale=3;${Cnt}/${Total}*100" | bc` 16date;echo ${Per}"% completed...." 17 18else 19break 20fi 21 22sleep 5 23 24done 25 26

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/10/02 07:40

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

2019/10/02 08:47

>t_obara ご回答ありがとうございます。 こちらはttyを操作するためのスクリプトのようなので 今回のエラーとは少し違うようです。 >otn コメントありがとうございます。 stdoutを表示するコードが ``stdout = subprocess.PIPE``だと思っていたのですが 勘違いでしたらご教授いただけると幸いです・・・。
otn

2019/10/02 09:13

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

回答1

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

python

1 2HOSTS=["HOST_A","HOST_B"] 3RMcmd="uname -a" ##SSH接続先で実行すること 4csv=RESULTS.csv 5logfile = open(csv, 'w') ##logfileを作る 6 7CNT=0 8pbar = tqdm(total=len(HOSTS)) 9 10while CNT < len(HOSTS): 11 12 for host in HOSTS: 13 14 Loccmd = ("ssh -o StrictHostKeyChecking=no {} '{}'".format(host,RMcmd)) 15 16 proc=subprocess.Popen(shlex.split(Loccmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 17 18 19 with open(csv, 'a') as f: 20 21 for line in proc.stdout: 22 errorfile = open(str(PyPath)+'/error/'+host+'_error.csv', 'w') #ホスト毎にエラーファイルを作成 23 f.write(str(line.decode('utf-8'))) #標準出力 24 errorfile.write(str(proc.stderr)) #標準エラー出力 25 proc.wait() 26 27 CNT +=1 28 pbar.update(1) 29 30

投稿2019/10/03 07:44

stweoigh

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問