Python не запускает команды оболочки после перезагрузки с использованием агента запуска

Итак, я запускаю скрипт Python (2.7) через агент запуска в macOS 10.13. Скрипт запускается, и во время выполнения вызывает перезагрузку компьютера. Когда компьютер снова включается и входит в систему, агент запуска снова запускает сценарий. Сценарий читает журналы и выполняет команду switch:case, чтобы продолжить с того места, где он остановился.

Проблема в том, что после перезагрузки скрипт python не может выполнить некоторые команды оболочки. ls -l работает нормально. Однако, когда я пытаюсь запустить что-то, чего нет в /bin, кажется, что это просто... пропускается. Никаких ошибок, он просто не делает этого.

Вот соответствующий код. Я удалил большую часть деталей, а также управление переключателем, потому что убедился, что они работают независимо.

#!/usr/bin/python

import logging
import os
import subprocess
import time

#globals
path_to_plist = 'User/Me/Library/Preferences/PathTo.plist'


def spot_check():
    #determine where we are in the test, verified it works
    return loop_number

def func_that_checks_stuff():
    results = subprocess.check_output(['System/Library/Path/To/tool','-toolarg'])
    ###process results
    logging.info(results)

def restarts(power_on, power off):
    #sets plist key values for the restart app
    subprocess.Popen('defaults write {} plist_key1 {}'.format(path_to_plist, power_on), shell=True
    subprocess.Popen('defaults write {} plist_key2 {}'.format(path_to_plist, power_off), shell=True

    #run the restart app, which is a GUI application in /Applications
    logging.info('Starting restart app')
    subprocess.Popen('open -a RestartApp.app', shell=True)
    time.sleep(power_on + 5)

def main():
    ###setup and config stuff, verified its working

    #switch control stuff, verified its working
    loop = spot_check()

    if loop == 0:
        #tool that shows text on the screen
        subprocess.Popen('User/Me/Library/Scripts/Path/To/Text/tool -a -args', shell=True)
        logging.info('I just ran that tool')
        subprocess.check_output('ls -l', shell=True)
        restarts(10, 0)
    if loop == 1:
        func_that_checks_stuff()
        subprocess.Popen('User/Me/Library/Scripts/Path/To/Text/tool -a args', shell=True)
        logging.info('Hey I ran that tool again, see?')
        restarts(10, 0)
    else:
        func_that_checks_stuff()
        subprocess.Popen('User/Me/Library/Scripts/Path/To/Text/tool -a args', shell=True)

    print 'You finished!'

if __name__ == '__main__':
    main()

Так что, если я начну это с помощью своего агента запуска, он будет нормально выполнять каждую последовательность.

  • На первом цикле (до перезагрузки) работает ВСЕ. Все записи, все инструменты, все.
  • После перезагрузки все журналирование работает, поэтому я знаю, что оно следует за переключателем. func_that_checks_stuff() работает и правильно регистрирует вывод. ls -l' call shows me exactly what I should see. But,Path/To/Text/tooldoesn't run, and when I callrestarts()` никогда не открывает приложение.
  • Ошибок не возникает, по крайней мере, я могу найти

Что я делаю не так? Это как-то связано с путями инструментов?


person Mark Edmondson    schedule 17.11.2017    source источник


Ответы (1)


Обновлять:

Как оказалось, решение состояло в том, чтобы добавить 20-секундную задержку в начале скрипта. Похоже, что он пытался запустить рассматриваемые команды до того, как Window Server закончил загрузку, и это испугало всех. Не особенно элегантное решение, но оно работает для того, что мне нужно в этом проекте.

person Mark Edmondson    schedule 18.11.2017