簡體   English   中英

在nohup上的python子進程輸出

[英]python subprocess output on nohup

嘗試使用執行df -h .的python腳本監視遠程計算機的可用物理磁盤空間df -h . 使用subprocess.popen命令。

import subprocess
import time
command = 'ssh remoteserver "df -h ."'
while True:
    proc = subprocess.Popen(command,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output,err=proc.communicate()
    print output
    print err
    time.sleep(60)

從命令行運行時,腳本可以正常運行並將輸出打印到終端

$> python2.7 script.py

Filesystem            Size  Used Avail Use% Mounted on
remoteserver:/home/user
                      555G  447G  109G  81% /home

使用nohup命令啟動腳本時,這些腳本不會產生任何輸出或似乎被阻止。

$> nohup python2.7 script.py &

當腳本在nohup啟動時,希望腳本能夠使用上述腳本工作並獲取遠程計算機的磁盤空間。

我不是100%肯定這里的根本問題,但是當您在外殼中調用NOHUP時,它將斷開某些STDIN / STDOUT與終端進程的連接,我懷疑這會引起您所看到的這種交互。

鑒於您是從遠程計算機執行此操作,因此我實際上建議您考慮使用Fabric之類的東西作為庫來完成您要執行的操作。 它非常簡單,可以完成大多數終端會話,並在完成后為您很好地關閉事務。

就像是:

from fabric import api
from fabric.api import env
import fabric

env.host_string = '%s@%s' % (username, remote_host)
env.disable_known_hosts = True
env.password = password
fabric.state.output['stdout'] = False
fabric.state.output['stderr'] = False

results = api.run('df -h')

您可以嘗試將stdin = subprocess.PIPE發送到subprocess命令,然后在對communication()進行調用之前,在下一行調用proc.stdin.close()。 或者,您可以嘗試將命令更改為'ssh remoteserver“ df -h”。 <的/ dev /空”。 其他人報告使用FNULL = open(os.devnull,'r')並將FNULL傳遞給stdin =參數,但是我不確定是否需要在之后調用FNULL.close()。

從nohup運行SSH時,SSH很可能出於某種原因等待輸入。 也許它無法在nohup環境中進行身份驗證,並要求輸入密碼?

要確保SSH不在等待輸入,請嘗試在ssh命令中添加-o“ BatchMode yes”,並查看子進程通訊調用的輸出/錯誤是否有某些線索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM