Я пытаюсь выполнить следующую команду из python subprocess.run():

tmux send-keys -t sessionp:4 "source /home/user/script.sh

Чтобы запустить скрипт оболочки bash в сеансе tmux.

cmd = 'tmux send-keys -t sessionp:4 "source /home/user/script.sh'
p = subprocess.run(cmd, shell=True, check=True)

Python не дожидается окончания выполнения script.sh, и поскольку следующей части скрипта на python требуется файл, созданный script.sh, происходит сбой.

Как я могу заставить подпроцесс ждать до конца выполнения script.sh?

1 ответ1

1

subprocess.run() не имеет этой информации. На самом деле, даже tmux не имеет этой информации.

Вы не говорите tmux запустить команду и ждать; вы говорите, чтобы имитировать некоторые нажатия клавиш. Он даже не знает, что эти нажатия клавиш на самом деле соответствуют сценарию, и тем более не знают, когда этот сценарий будет завершен.

Это плохой метод запуска скрипта, но если вы должны его использовать, то ваши возможности ограничены:

  • Вы можете опросить (периодически проверять), появился ли файл.

    while not os.path.exists(...):
        time.sleep(1)
    
  • Вы можете использовать inotify (Linux) или kqueue (FreeBSD) для просмотра каталога; ядро сообщит вам, когда появится файл.

  • Вы можете создать именованный канал и попробовать прочитать его. Это будет ждать, пока другая программа (например, ваш скрипт) действительно не напишет что-то там. (Это, конечно, требует добавления команды 'echo' в конце скрипта или после команды 'source'.)

  • Вы можете сделать вышеупомянутое, используя некоторую другую форму IPC (например, сигналы вместо каналов).

  • Вы даже можете использовать tmux для сигнализации:

    1. После выполнения этой команды запустите и дождитесь tmux wait -L myscript ;

    2. Отредактируйте ваш скрипт или команду «source» для запуска tmux wait -U myscript когда закончите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .