В настоящее время я разрабатываю приложение для хостинга сервера (в основном для себя/в учебных целях), и все работает отлично, а что нет? Я не знаю, многие ли из вас знакомы с 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, проблем с взаимодействием с ним возникнуть не должно.
Если вы используете
screen
,tmux
, или подобное решение, вам не нужно отсоединять сервер. Вы можете безопасно оставить его "присоединенным" к консоли и отсоединить сам экран.вы можете использовать его
/proc/N/fd/{0,1}
для связи, если у вас есть соответствующие права, где N — PID демона, fd0 — обычно stdin, а fd1 — stdout процесса N.Ваш подход с именованным каналом (FIFO) по сути правильный, но вы делаете это только наполовину правильно. Вы изменили stdout процесса на канал, что означает, что все, что выводится на stdout демоном, записывается в канал, откуда вы можете извлечь это, скажем, cat. Канал полудуплексный, что означает, что он может соединить только один вход с одним выходом. Вам нужны два канала, один для ввода, один для вывода. Тогда все, что вы отправите демону по одному каналу, попадет туда, в то время как ответ пойдет по другому каналу обратно в другую программу, которая будет читать канал.
Предположим, что есть два канала pin
и pout
. Вы запускаете:
демон < pin >надутый
Затем вы должны запустить что-то вроде
кошачья гримаса и кошка > булавка
для того, чтобы общаться. Это плохой пример, он может иметь состояние гонки, поскольку он асинхронный, но я надеюсь, вы поняли идею.