0

Ubuntu サーバーのバックグラウンドで定期的にスクリプトを実行しています。RStudio で実行すると、すべてが期待どおりに機能します。しかし、Rscriptを使用してターミナル経由で実行すると、pythonスクリプトを呼び出すときにスタックします(常にではありません...しかし、多くの場合、スタックします)。(Rscriptを停止すると、Pythonスクリプトが実行されていることが常に通知されるため、そこでスタックすることはわかっています)。私はchmod 777そのpythonスクリプトを編集しましたが、手がかりはありません。

これは数日前までは正常に機能していましたが、理由はわかりません。

Rscript文:

Rscript /home/XXX/XXX/scriptServicioBBDDHS.R

R コードで停止する場所:

outputMACs <- system(ignore.stdout = F, ignore.stderr = T, 
                   "python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)

Python スクリプトは、MikroTik ルーター用の API です。ルーターからの応答を読み取ろうとすると、スタックします。この文では:

r = select.select([s, sys.stdin], [], [], None)

main()Pythonスクリプトのコードを入れます:

def main():
    s = None
    for res in socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):
        af, socktype, proto, canonname, sa = res
        try:
             s = socket.socket(af, socktype, proto)
        except (socket.error, msg):
            s = None
            continue
        try:
            s.connect(sa)
        except (socket.error, msg):
            s.close()
            s = None
            continue
        break
    if s is None:
        print ('could not open socket')
        sys.exit(1)

    apiros = ApiRos(s);
    apiros.login(sys.argv[2], sys.argv[3]);

    inputsentence = ['/ip/hotspot/active/print', '=detail=']
    apiros.writeSentence(inputsentence)

    t_end = time.time() + 2
    while time.time() < t_end:
        r = select.select([s, sys.stdin], [], [], None)
        if s in r[0]:
            # something to read in socket, read sentence
            x = apiros.readSentence()

ご協力ありがとうございました。このスクリプトは、最初にcrontabを使用して最初に使用したときは常に機能していました。今は失敗するだけです。

セルジオ。

4

1 に答える 1

0

MikroTik API にバグの可能性があることを発見しました。問題は文にあった

r = select.select([s, sys.stdin], [], [], None)

sys.stdin を省略するように書き直さなければなりませんでした

r = select.select(s, [], [], 0.0)

そして、それが機能するためには、次の引数を使用して R 経由でシステム コールを実行する必要があります。

system(ignore.stdout = F, ignore.stderr = T, "python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)

stderr出力を無視しないと機能しません。

于 2015-10-22T11:26:19.507 に答える