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

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

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

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

а потом, если бы я хотел

echo "changelevel de_dust2" > /tmp/server

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

2 ответа

Решение

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

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

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

echo "changelevel de_dust2" > /tmp/server

Обратите внимание sleep Команда необходима, чтобы держать трубу открытой, потому что каждый echo команда попытается закрыть его, когда он закончится, возможно, завершается startserver,

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

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

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

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

Предположим, есть две трубы pin а также pout, Ты бежишь:

демон pout

Then you must run something like

cat pout & cat > pin

in order to communicate. This is a bad example, it can have race conditions since it's asynchronous but I hope you get the idea.

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