Как запустить фоновую оболочку или ядро (например, 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.
Это помогает?