systemd falha ao reconhecer o arquivo pid

0

Então, estou tentando iniciar um serviço no sistema systemd ativado. O nome do serviço é ossec-hids-authd , que é o mecanismo de autenticação (agentes) do ossec (Software de Detecção de Intrusão). Quando eu começo e inicio o script de inicialização, o systemctl expira e, ao obter o status, vejo este erro.

/etc/init.d/ossec-hids-authd status
● ossec-hids-authd.service - LSB: Authentication Daemon for OSSEC-HIDS.
   Loaded: loaded (/etc/rc.d/init.d/ossec-hids-authd; bad; vendor preset: disabled)
   Active: failed (Result: timeout) since Thu 2018-02-22 07:34:28 UTC; 11min ago
     Docs: man:systemd-sysv-generator(8)

Feb 22 07:24:11 ip-10-0-197-117.ec2.internal systemd[1]: Starting LSB: Authentication Daemon for OSSEC-HIDS....
Feb 22 07:24:11 ip-10-0-197-117.ec2.internal ossec-hids-authd[21142]: [39B blob data]
Feb 22 07:24:11 ip-10-0-197-117.ec2.internal systemd[1]: PID file /var/run/ossec-authd.pid not readable (yet?) after start.
Feb 22 07:24:11 ip-10-0-197-117.ec2.internal ossec-hids-authd[21142]: 2018/02/22 07:24:11 ossec-authd: INFO: Started (pid: 21148).
Feb 22 07:34:28 ip-10-0-197-117.ec2.internal systemd[1]: ossec-hids-authd.service start operation timed out. Terminating.
Feb 22 07:34:28 ip-10-0-197-117.ec2.internal systemd[1]: Failed to start LSB: Authentication Daemon for OSSEC-HIDS..
Feb 22 07:34:28 ip-10-0-197-117.ec2.internal systemd[1]: Unit ossec-hids-authd.service entered failed state.
Feb 22 07:34:28 ip-10-0-197-117.ec2.internal systemd[1]: ossec-hids-authd.service failed.
Feb 22 07:40:20 ip-10-0-197-117.ec2.internal ossec-hids-authd[21142]: 2018/02/22 07:40:20 ossec-authd(1225): INFO: SIGNAL [(15)-(Terminated)] Received. Exit Cleaning...

Agora, no script de inicialização, esse processo está realmente criando o arquivo pid em /var/ossec/var/run , em vez de /var/run , e verifiquei se o arquivo pid foi realmente criado lá. Mas de alguma forma o systemctl está deixando de reconhecê-lo.

É possível que o systemd não reconheça arquivos pid criados fora de /var/run e, se for esse o caso, como fazer isso?

Abaixo está o script de inicialização

#!/bin/sh
#
# ossec-authd  Start the OSSEC-HIDS Authentication Daemon
#
# chkconfig: 2345 99 01
# description: Provides key signing for OSSEC Clients
# processname: ossec-authd
# config: /var/ossec/etc/ossec.conf
# pidfile: /var/run/ossec-authd.pid
### BEGIN INIT INFO
# Provides:          ossec-authd
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Authentication Daemon for OSSEC-HIDS.
# Description:       Provides key signing for OSSEC Clients
### END INIT INFO

# Author: Brad Lhotsky <[email protected]>
NAME=ossec-authd
DAEMON=/var/ossec/bin/ossec-authd
DAEMON_ARGS="-p 1515 2>&1 >> /var/ossec/logs/ossec-authd.log &"
PIDDIR=/var/ossec/var/run
SCRIPTNAME=/etc/init.d/ossec-authd

. /etc/rc.d/init.d/functions

getpid() {
    for filename in $PIDDIR/${NAME}*.pid; do
        pidfile=$(basename $filename)
        pid=$(echo $pidfile |cut -d\- -f 3 |cut -d\. -f 1)
        kill -0 $pid &> /dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            PIDFILE=$filename
            PID=$pid
        else
            rm -f $filename
        fi;
    done;
}

start() {
  echo -n $"Starting $NAME: "
  daemon $DAEMON $DAEMON_ARGS
  retval=$?
  if [ $retval -eq 0 ]; then
    echo_success
    echo
  else
    echo_failure
    echo
  fi
  return $retval
}

stop() {
  echo -n $"Stopping $NAME: "
  getpid
  killproc -p $PIDFILE $NAME
  retval=$?
  echo
  return $retval
}

restart() {
  stop
  start
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    getpid
    if [ -z $PIDFILE ]; then
        status $NAME
    else
        status -p $PIDFILE $NAME
    fi;
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage: $0 {start|stop|status}"
    exit 2
    ;;
esac

exit $?
    
por shivams 22.02.2018 / 09:05

2 respostas

2

O systemd analisa os comentários de um script de inicialização para gerar um arquivo .service temporário na inicialização ou no comando daemon-reload . Mude a linha

# pidfile: /var/run/ossec-authd.pid

para

# pidfile: /var/ossec/var/run/ossec-authd.pid

e execute systemctl daemon-reload

UPD: agora vejo que o nome do arquivo pid é gerado pelo authd no tempo de execução e o script init precisa procurar por $ PIDDIR / $ {NAME} *. pid.

O Systemd não pode procurar pelo pidfile, mas pode funcionar sem ele. Sou você pode tentar remover completamente a linha # pidfile: , ou escrever seu próprio arquivo .service

    
por 22.02.2018 / 09:39
1

Tudo isso é totalmente desnecessário.

O comportamento de systemd-sysv-generator com um script de van Smoorenburg rc que tem os cabeçalhos antigos de comentários do RedHat e os cabeçalhos do LSB é interessante, mas é inútil gastar seu tempo.

Não perca seu tempo arrumando seu script Smoorenburg rc da van e tentando fazer com que os arquivos PID funcionem. Você não precisa realmente do mecanismo de arquivo PID instável e perigoso, em primeiro lugar, com o gerenciamento de serviço adequado. Nem você precisa de wrappers como ossec-control . Esqueça tudo isso e torne-se uma unidade de serviço do sistema.

Duas unidades de serviço de modelo simples para duas categorias diferentes de serviços OSSEC, de acordo com a necessidade de uma opção -f , estão nas respostas listadas como leitura adicional aqui. Adapte um ou os dois.

Leitura adicional

por 22.02.2018 / 19:31