Solved - Iniciar hlds no arranque do sistema

Frango.

Power Member
Boas

Tenho o hlds instalado no meu server debian, mas se quiser reiniciar/desligar o servidor ao ligar novamente tenho de arrancar manualmente. Já googlei muito e encontrei um script, porém não funciona diz que não foi encontrado o /bin/bash. O código é este:

Código:
#! /bin/bash
#
# Start the Counter-Strike dedicated server.
#
# AUTHORS :
#
# Julien Escario ( [email protected] )
# &
# Cedric Rochat ( [email protected] )
# &
# Cmdr._Firewalker ( [email protected] )
#
# ===========================================
#
# What you need:
#
# Linux :)
# awk
# screen
# the hlds_l & cstrike files (obtainable via steam)
#
# How to use:
#
# Edit the CS_USER-Var to the user running your cs-servers.
# Edit the DIR-Var to fit your system (just contains the path to the dir that contains hlds_run).
# Edit the PARAMS-Var to fit your needs - standard is startup as internet server.
# If you want to use multiple scripts on one system change the NAME-var.
#
# When this is done, copy the file to /etc/init.d (or whereever your system stores the
# scripts for starting services) and set the execute permission.
# Now you can link the script to your runlevel-dir, here's an example for runlevel 3:
# ln -s /etc/init.d/hlds /etc/rc3.d/S90hlds
# ln -s /etc/init.d/hlds /etc/rc3.d/K50hlds
# or use update-rc.d (Debian etc.) or similar systools.
#
# Or use it manually like:
# ./hlds start
# ./hlds stop
#
# To see the server-console start the script with the parameter "watch".
#
# DOC by jwm ([email protected])

# ===========================================
# !!!!!!!!!!!!!! CHANGE THIS TO THE USER YOU USE FOR YOUR SERVER !!!!!!!!!!!!!!!
CS_USER=root

# # DON'T FORGET TO CHANGE THE PATH TO YOUR NEEDS!
DIR=/usr/hlds

# LAN server:
# PARAMS="-game cstrike -nomaster -insecure +sv_lan 1 +maxplayers 16 +map de_dust"
# Internet server:
PARAMS="-game cstrike +map de_dust +maxplayers 12 -port 27015"

NAME=csserver
DESC="CS dedicated server"

# No edits (should be) necessary beyond this line
# ===========================================
DAEMON=hlds_run
PATH=/bin:/usr/bin:/sbin:/usr/sbin

if ! which awk; then echo "You need awk for the script $0"; exit 1; fi
if ! which screen; then echo "You need screen (the program, moron!) for the script $0"; exit 1; fi

if [ `whoami` = root ]
then
 usagetype=root
else
 usagetype=nonroot
fi

start() {
   if [ ! -d $DIR ]; then echo " ... No such directory: $DIR!";  exit 1; fi
   if [ ! -x $DIR/$DAEMON ]; then echo "$DIR/$DAEMON does not exist or is not executable!"; exit 1; fi
   if status; then echo " ... $DESC: $NAME is already running!"; exit 1; fi

   case "$usagetype" in
   root)
    su - $CS_USER -c "cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS"
   ;;
   nonroot)
    cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS
   ;;
   esac

}

stop () {
   if ! status; then echo " ... $DESC $NAME could not be found. Probably not running."; exit 1; fi

   case "$usagetype" in
   root)
    tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $CS_USER -c "screen -r $tmp -X quit"
   ;;
   nonroot)
    screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}') -X quit
   ;;
   esac
}

status () {
   case "$usagetype" in
   root)
    su - $CS_USER -c "screen -ls" | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   nonroot)
    screen -ls | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   esac
}

watch () {
   if ! status; then echo "$DESC $NAME could not be found. Probably not running."; exit 1; fi

   case "$usagetype" in
   root)
    tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $CS_USER -c "screen -r $tmp"
   ;;
   nonroot)
    screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
   ;;
   esac
}

case "$1" in
 start)
  echo "Starting $DESC: $NAME"
  start
  echo " ... done."
 ;;

 stop)
  echo "Stopping $DESC: $NAME"
  stop
  echo " ... done."
 ;;

 restart|force-reload)
  echo "Restarting $DESC: $NAME"
  status && stop
  start
  echo " ... done."
 ;;

 status)
  if status
  then echo "$DESC: $NAME is UP" 
  else echo "$DESC: $NAME is DOWN"
  fi
 ;;
 watch)
  watch
 ;;

 *)
   echo -e "Usage: $0 {start|stop|status|restart|watch}\nWhile watching press ctrl-a, ctrl-d to stop watching without stopping the server."
   exit 1
 ;;

esac


exit 0

Alguém me pode ajudar? É muito importante e já a um dia que ando nisto, se souberem outra forma de iniciar no boot agradecia que postassem. Lembrando também que tenho webmin.

Cumprimentos
 
La para o inicio do script, tens umas linhas que dizem:

# Now you can link the script to your runlevel-dir, here's an example for runlevel 3:
# ln -s /etc/init.d/hlds /etc/rc3.d/S90hlds
# ln -s /etc/init.d/hlds /etc/rc3.d/K50hlds

Fizeste essa parte?

As directorias "/etc/rc*.d" sao responsaveis por parar/iniciar automaticamente os servicos confiurados no respectivo runlevel.

Se por acaso fizeste, e seguiste mesmo a letra, tambem nao ira funcionar.
Visto que esse exemplo e para runlevel 3 (tal como e indicado) mas Debian (e derivados) correm em runlevel 2, por defeito.
Logo tens que substituir "rc3.d" por "rc2.d".
 
Olhando para a primeira linha do script, não costuma levar um espaço, mas não deveria afectar nada, ficando assim:

Código:
#!/bin/bash

Se não der experimenta:

Código:
#!/bin/sh
 
La para o inicio do script, tens umas linhas que dizem:

# Now you can link the script to your runlevel-dir, here's an example for runlevel 3:
# ln -s /etc/init.d/hlds /etc/rc3.d/S90hlds
# ln -s /etc/init.d/hlds /etc/rc3.d/K50hlds

Fizeste essa parte?

As directorias "/etc/rc*.d" sao responsaveis por parar/iniciar automaticamente os servicos confiurados no respectivo runlevel.

Se por acaso fizeste, e seguiste mesmo a letra, tambem nao ira funcionar.
Visto que esse exemplo e para runlevel 3 (tal como e indicado) mas Debian (e derivados) correm em runlevel 2, por defeito.
Logo tens que substituir "rc3.d" por "rc2.d".

Sim eu fiz isso.

Olhando para a primeira linha do script, não costuma levar um espaço, mas não deveria afectar nada, ficando assim:

Código:
#!/bin/bash
Se não der experimenta:

Código:
#!/bin/sh

Fiz o que disseste e não deu na mesma, o erro que dá é este:

/etc/init.d/rc: /etc/rc2.d/S90hlds: /bin/sh^M: bad interpreter: No such file or directory

o problema é que existe essa pasta/ficheiro só não percebo é o que é ^M
 
Isso parece ser a conversao de caracters.
Experimenta correr o commando "dos2unix" nesse ficheiro para limpar qualquer codificacao windows.


Dizes que se correres o ficheiro manualmente, tudo funciona.
Como e que o corres? Executa-lo simplesmente "./(ficheiro)" ou usas "bash (ficheiro)"?
 
Sim, uso:

cd /usr/hlds
./hlds_run -game cstrike blablabla

e tudo funciona

1)
O script que esta a dar problemas e o "/etc/init.d/hlds".
Ja experimentas-te arrancar o jogo atraves do "/etc/init.d/hlds" ao inves de correres o executavel directamente?


2)
Chegaste a correr o programa "dos2unix" no ficheiro "/etc/init.d/hlds"?


3)
Logo apos a primeira linha "#!/bin/bash" adiciona o seguinte:

exec > /tmp/hlds.out 2>>&1

Isto vai redireccionar o stdout e stderr do script para o ficheiro "/tmp/hlds.out".
Reinicia a maquina e analisa o conteudo desse ficheiro.
 
Última edição:
Obrigado pela tua ajuda, mas deparei-me por acaso com um site que no fim explicava como iniciar no boot o hlds. E como fiz? Editei o /etc/rc.local e adicionei isto antes do exit 0:

Código:
cd /usr/hlds
./hlds_run -game cstrike -autoupdate +maxplayers 20 +map de_dust2 > /dev/null 2>&1 &

Afinal é simples fazer este tipo de coisas, mas como sou novo em linux em text-mode tenho de me habituar :p
 
Back
Topo