Как в Linux запустить процесс, к которому я смогу вернуться позже, чтобы дать команду после отсоединения?

Как в Linux запустить процесс, к которому я смогу вернуться позже, чтобы дать команду после отсоединения?

В настоящее время я разрабатываю приложение для хостинга сервера (в основном для себя/в учебных целях), и все работает отлично, а что нет? Я не знаю, многие ли из вас знакомы с Counter-Strike в целом, но я запускаю свой сервер, и все в порядке, но я отключаюсь от него (все это написано на Node.js), поэтому я не могу использовать screenили что-то еще. Но, по сути, если бы я хотел изменить уровень на сервере, я бы мог ввести текст changelevel de_dust2или что-то еще, если бы я запускал сервер вручную, но поскольку я отключился, у меня нет возможности дать этому процессу какие-либо команды.

Я читал о FIFO и использовании сокетов Unix, но, похоже, все, что они делают, это возвращают мне эхо. Я не уверен, понимаю ли я FIFO, но я думал, что смогу.

mkfifo /tmp/server echo "./startserver" > /tmp/server &

и потом, если я захочу,

echo "changelevel de_dust2" > /tmp/server

Извините, если я не совсем ясно выразился, по сути у меня есть процесс-демон, которому я хочу отправлять команды.

решение1

Вы должны убедиться, что ваш «демон»-процесс считывает данные из канала.

mkfifo /tmp/server
./startserver < /tmp/server &
sleep 10000 > /tmp/server &

В дальнейшем все, что вы напишете, /tmp/server/появится на startserverстандартном вводе , например:

echo "changelevel de_dust2" > /tmp/server

Примечание: sleepкоманда необходима для сохранения канала открытым, поскольку каждая echoкоманда будет пытаться закрыть его по завершении, что может привести к завершению startserver.

решение2

Мне на ум приходят три способа. Пока процесс-демон использует stdin/out, проблем с взаимодействием с ним возникнуть не должно.

  1. Если вы используете screen, tmux, или подобное решение, вам не нужно отсоединять сервер. Вы можете безопасно оставить его "присоединенным" к консоли и отсоединить сам экран.

  2. вы можете использовать его /proc/N/fd/{0,1}для связи, если у вас есть соответствующие права, где N — PID демона, fd0 — обычно stdin, а fd1 — stdout процесса N.

  3. Ваш подход с именованным каналом (FIFO) по сути правильный, но вы делаете это только наполовину правильно. Вы изменили stdout процесса на канал, что означает, что все, что выводится на stdout демоном, записывается в канал, откуда вы можете извлечь это, скажем, cat. Канал полудуплексный, что означает, что он может соединить только один вход с одним выходом. Вам нужны два канала, один для ввода, один для вывода. Тогда все, что вы отправите демону по одному каналу, попадет туда, в то время как ответ пойдет по другому каналу обратно в другую программу, которая будет читать канал.

Предположим, что есть два канала pinи pout. Вы запускаете:

демон < pin >надутый

Затем вы должны запустить что-то вроде

кошачья гримаса и кошка > булавка

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

Связанный контент