2014-10-21 5 views
0

Итак, я создаю быстрый скрипт, который в основном запускает xboxdrv, затем игру из пара, чтобы поддерживать поддержку контроллера. Да, в то время как большинство игр с поддержкой контроллера автоматически работают с контроллером Xbox 360, есть несколько игр, в которых вам нужно будет управлять контроллером под драйвером xpad, иначе он не узнает контроллер по какой-либо причине. В игре речь идет о Bit.Trip Runner 2 на Linux (XUbuntu).Подождите, пока процесс, запущенный другой программой, завершится

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

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

sudo --validate 
sudo xboxdrv --silent --detach-kernel-driver --mimic-xpad --dbus session & sleep 2 
steam steam://rungameid/$APPID #<-- I want the game to exit to then kill xboxdrv 
wait -n $! #<-- If I don't put wait, it will immediately kill xboxdrv after the game launches 
sudo killall xboxdrv 
exit 0 
+2

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

+1

Да, извините. Когда я отправил этот вопрос, я спал. Просто интересно, будет ли это работать, если я использую * pgrep * для поиска модуля процесса, а затем скажу * wait *, чтобы ждать этого идентификатора? – Tech0verlord

ответ

1

Ну, похоже, проблема в том, что wait не прикладывал должным образом, то о дочерних процессах. Если это не было то, что он ждал xboxrdv, то он не мог правильно применить себя. После того, как я немного оглянулся, я столкнулся с this question, который дал мне код, который мне нужен для ожидания. Так что я закончил делать, добавлял этот бит кода вместе с командой pgrep -x, чтобы он мог схватить и подождать подходящего pid.

Таким образом, в конце концов, важная часть кода в конечном итоге глядя, как это:

if [ "$GAMENAME" = "BTR2" ] || [ "$GAMENAME" = "Runner 2" ]; then 
    APPID=218060 
    GameProc=[r]unner2 
fi 

sudo --validate 
sudo xboxdrv --silent --quiet --detach-kernel-driver --mimic-xpad --dbus session & sleep 2 
steam steam://rungameid/$APPID & sleep 20 

check_run_and_grab(){ 
if ps aux | grep "$GameProc" > /dev/null 
    then 
     GamePID=$(pgrep -x "$GameProc") 
     while kill -0 "$GamePID";do 
      sleep 5 
     done 
     sudo killall xboxdrv 
     exit 0 
    else 
     echo "Game process not found, waiting 5 seconds and trying again" 
     sleep 5 
     check_run_and_grab 
fi 
} 

check_run_and_grab 

для меня, единственное, что бы сделать это лучше, если бы не заботиться о капитализации за игру аргумента (первое заявление if).

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