2010-01-01 2 views
2

Возможно ли в i/o работать? я несколько игровых серверов работает так:Linux i/o для запуска демона/процесса

cd /path/to/game/server/binary 
./binary arg1 arg2 ... argn & 

Можно ли написать сообщение на сервер, если я знаю идентификатор процесса?

Нечто подобное было бы удобно:

echo "quit" > process1234 

Где process1234 процесс (с Сидом 1234).

Игровой сервер не является бинарным, написанным мной, но это двоичный код Call of Duty. Поэтому я ничего не могу изменить в коде.

+0

Отредактировал свой ответ с более общим предложением. – Omnifarious

ответ

1

Да, вы можете запустить процесс с помощью трубы в качестве своего stdin, а затем записать в трубу. Вы можете использовать именованный или анонимный канал.

Обычно для этого потребуется родительский процесс, который создаст анонимный канал и предоставит его дочернему процессу, так как его stdin-popen() делает это, многие библиотеки также реализуют его (см. IPC Perl: Open2 например)

Другим способом было бы запустить его под псевдонимом, что и делает «экран». Сам экран также может иметь механизм для этого.

+0

Я думаю, что я использую экран. Сначала я должен узнать, как это использовать: P – VDVLeon

+1

Существуют альтернативы экрану GNU, например http://www.cliki.net/detachtty и http://caca.zoy.org/wiki/neercs - фактически, первый может быть проще взаимодействовать, программно. – ephemient

1

Только в том случае, если процесс прослушивает какое-либо сообщение. Например, ваш игровой сервер может ожидать ввода в файл, через сетевое соединение или со стандартного ввода.

Если ваш процесс не активно прослушивает что-то, единственное, что вы действительно можете сделать, это остановить или убить его.

Теперь, если ваш процесс ждет стандартного ввода, и вы запускали его, как так:

$ myprocess & 

Тогда (в Linux), вы должны быть в состоянии попробовать следующее:

$ jobs 
[1]+ Running     myprocess & 
$ fg 1 

И в этот момент вы вводите стандартный ввод в свой процесс.

+0

На сервере есть консоль ввода для команд. Команда quit завершает работу с сервером. Я могу убить , но потом я перепутаю файлы журналов. Поэтому я хочу выйти из сервера, как и должно быть. Поэтому сервер прослушивает stdin. – VDVLeon

+0

задания не существует (больше). Может быть, потому, что сервер запускается сценарием cronjob, а затем ничего не сохраняется? – VDVLeon

1

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

Но поскольку вы, например, запрашиваете, что процесс завершен, я бы рекомендовал попробовать сигналы. Сначала попробуйте отправить TERM (т.е. прекратить) сигнал, который по умолчанию:

kill _pid_ 

Если это не работает, вы можете попробовать другие сигналы, такие как QUIT:

kill -QUIT _pid_ 

Если все остальное терпит неудачу , вы можете использовать сигнал KILL. Это гарантируется (*), чтобы остановить этот процесс, но этот процесс не будет иметь никаких изменений убирать:

kill -KILL _pid_ 

* - в прошлом, kill -KILL не будет работать, если процесс был повешен, когда на файловый сервере слоеных сетей , Не знаю, установили ли они это.

+0

Существует много причин для состояния «D» (http://en.wikipedia.org/wiki/Uninterruptible_sleep), ожидая, что NFS I/O станет одним из наиболее частых случаев. Linux продвигается к устранению некоторых из них в пользу прерывистых снов, но многие системные вызовы невозможно перезапустить, если они прерваны. – ephemient

1

Я уверен, что это будет работать, так как сервер имеет консоль на стандартном вводе:

echo "quit" > /proc/<server pid>/fd/0 

Вы упоминаете в комментариях ниже, что ваш процесс не является для чтения с консоли на дескрипторе 0. Но это должно быть на каком-то fd. ls -l /proc/<server pid/>/fd/ и найдите тот, который указывает на/dev/pts /, если процесс запущен в gnome-terminal или xterm или что-то в этом роде.

+0

Если я запустил: ln -al/proc//fd/0, я получаю: lr-x ------ 1 корень root 64 jan 1 23:00 0 ->/dev/null Так что нет входной поток. Я что-то вспомнил. На сервере есть консольная строка ввода, всегда в нижней части консоли linux. Поэтому, возможно, он использовал ncurses (или что-то) для чтения ввода. Может быть, тогда есть другая fd для этой входной строки консоли? – VDVLeon

0

Если вы хотите сделать несколько простых операций на своем сервере, используйте сигналы, как указано в другом месте. Настройте обработчики сигналов на сервере и каждый сигнал выполняет другое действие, например.:

  • SIGINT: Перечитайте конфигурационный файл
  • SIGHUP: бросить

...

0

Высоко хаком, не делайте этого, если у вас есть Санер альтернативу, но вы можете перенаправить дескрипторы файла процесса на лету, если у вас есть права ptrace.

 
$ echo quit > /tmp/quitfile 
$ gdb binary 1234 
(gdb) call dup2(open("/tmp/quitfile", 0), 0) 
(gdb) continue 

open("/tmp/quitfile", O_RDONLY) возвращает файловый дескриптор /tmp/quitfile. dup2(..., STDIN_FILENO) заменяет существующий стандартный ввод новым дескриптором файла.

Мы вводим этот код в приложение с использованием gdb (но с числовыми константами, так как #define константы могут быть недоступны), и taadaah.

0

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

Смежные вопросы