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

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

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

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

echo "changelevel de_dust2" > /tmp/server

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

2 ответа2

0

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

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

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

echo "changelevel de_dust2" > /tmp/server

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

0

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

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

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

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

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

демон <pin> pout

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

кот дуться и кот> булавка

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

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