Rscript застрял при системном вызове python

У меня есть периодический скрипт, работающий в фоновом режиме на моем сервере 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 — это API для роутера MikroTik. Он зависает при попытке прочитать ответ от маршрутизатора. В этом предложении:

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. Сейчас просто не получается.

Серхио.


person Sergio Fernández    schedule 30.09.2015    source источник


Ответы (1)


Я нашел возможную ошибку в 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.

person Sergio Fernández    schedule 22.10.2015