Как запустить фоновую оболочку или ядро ​​(например, python), подключиться к нему и получить вывод

Это казалось чем-то довольно очевидным, но после долгих поисков не смог найти правильных поисковых терминов, чтобы получить ответ. Поиски таких вещей, как "подключиться к ядру Python", вызывали только страницы и страницы о Jupyter и IPython.

удар

Я нашел то, что имеет что-то близкое, используя сопроцесс.

Моя идеальная вещь была бы:

create_named_process proc1
create_named_process proc2

Затем каким-то образом отправьте команду в proc1 и получите выходные данные, а затем отправьте команду в proc2 и получите выходные данные. Затем сделайте это снова с большим количеством команд.

питон

Я нашел Python subprocess и bash subshell. Но не уверен, как сохранить тех, кто идет в фоновом режиме и подключиться к ним. Например, я мог бы сделать

process = subprocess.Popen(['your_background_command'])
stdoutdata, stderrdata = process.communicate()

Но я думаю, что если я убью процесс, в котором запустил подпроцесс, то подпроцесс умрет. (Комментатор сказал, что с помощью Shell=True приведет к тому, что процесс останется в живых, но не уверен, каким образом я получу к нему доступ. Они удалили комментарий).

Кроме того, как я могу передать больше команд процессу? Ничего подобного в документации.

Обратите внимание, что этот пост содержит правки.

1 ответ

Я не понимаю ваше ядро ​​в поиске, но кажется, что вам не хватает некоторых основ обработки bash stdio/stderr.

Процесс имеет (обычно) 3 стандартных потока ввода-вывода:

  • стандартный ввод (стандартный ввод)
  • стандартный вывод (стандартный вывод)
  • stderr (стандартная ошибка)

Вы можете перенаправить все эти потоки ввода-вывода с помощью каналов (|) или файлы (используя <,>,<< или же >>). Например:

ls -l | grep "r-x" | sed 's/^.*:...//' > 5_files.list

Вы можете вместо обычного файла использовать fifo:

mkfifo fifootje
tail -f fifootje | grep --line-buffered "r-x"  
ls -l > fifootje

или, с вашей идеей команды:

#!/bin/bash
mkfifo fifootje
while read line ; do
    case "$line" in
    (a) ls /tmp ;;
    (b) ls /var ;;
    (*) echo 'only a or b please' ;;
    esac
done

а затем эхо a или же b (по одному в строке) в fifo.

Это помогает?

Другие вопросы по тегам