Cómo cambiar la propiedad de un directorio determinado antes de reiniciar un servicio

Cómo cambiar la propiedad de un directorio determinado antes de reiniciar un servicio

Estoy intentando escribir un script que colocaré en el trabajo cron.

El script verificará cada 5 minutos si el proceso se está ejecutando, si no, tiene que iniciar el proceso, pero mi problema es que mientras se inicia el proceso, es propiedad de root y eso cambia algunos archivos en un directorio específico, así que quería haga que el script inicie el servicio, luego espere 10 segundos y detenga el servicio, luego irá al directorio específico y cambiará la propiedad de todos los archivos en ese directorio y luego el script iniciará el servicio nuevamente.

Espero que mi explicación tenga sentido.

Esto es lo que se me ocurrió hasta ahora. El script funciona para iniciar y detener el servicio, pero expira cuando el servicio se detiene y no cambia ninguna propiedad en el directorio dado.

#!/bin/bash
exec_start="sudo systemctl start new-service"
exec_stop="sudo systemctl stop new-service"
check1=/root/testing/
username="user1"
process="new-service"

changing_ownership () {
cd $check1 && /usr/bin/chown $username:$username *
}

startAndStop(){
/usr/bin/sudo su - user1 && $exec_start &
 sleep 10 && $exec_stop &
 sleep 2 && exit
}

startAgain(){
/usr/bin/sudo su - user1 && $exec_start &
sleep 5 && exit
}

if ps ax | grep -v grep | grep $process > /dev/null
then
 echo "running"
 exit

else
 echo "Not running...Going to start the service"
 startAndStop
 changing_ownership
 startAgain
fi

exit

Aquí está el contenido de /root/testing/

[root@server2 ~]# cd -
/root/testing
[root@server2 testing]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 24 21:34 file1
-rw-r--r--. 1 root root 0 Sep 24 21:34 file2
-rw-r--r--. 1 root root 0 Sep 24 21:34 file3
-rw-r--r--. 1 root root 0 Sep 24 21:39 file8888

Gracias

Respuesta1

Problemas de pareja que veo.

Hice un script de prueba simple:

#!/bin/bash
startAndStop(){
        echo "Start 1" &
        echo "Sleep 2" && echo "Stop 3"
        echo "Sleep 4" && exit
}
startAndStop
echo "Rest of Script"

Esto simula la función startAndStop de su programa.

Aquí está el resultado:

$ bash test.sh
Sleep 2
Stop 3
Sleep 4
Start 1

Dos puntos sobre esta función:

  1. Las cosas se ejecutan fuera de orden. El sencillo &pone en segundo plano la tarea de inicio. ¿Estás seguro de que querías hacer eso? ¿No le gustaría esperar a que se complete el proceso para detenerlo? Sé que pones sleeps, pero creo que esperar a que salga es mejor. Las cosas podrían ponerse muy extrañas si el comando no terminara a tiempo.

  2. Observe cómo no se imprimió Rest of Script. El exitcomando no sale de la función, sale del script completo.

Tienes /usr/bin/sudo su - user1 && $exec_start. No creo que eso sea lo que querías hacer. Configura exec_start="sudo systemctl start new-service". Entonces, lo que terminas haciendo es cambiar al usuario1 y luego elevar los permisos de root para iniciar el servicio. Nuevo script, en mi máquina. $(pwd)imprimirá el directorio actual.

#!/bin/bash
sudo su - user1 && /usr/bin/sudo echo $(pwd)

Ejecutémoslo:

[root]$ bash test.sh
[user1]$

¡Tengo un caparazón! El&& espera la finalizacióndel comando anterior, es decir sudo su -, que proporciona un shell raíz. El echocomando no se ejecutó hasta que salí del shell:

[user1]$ exit
logout
/root
[root]$

Incluso entonces, dio el /rootdirectorio, no /home/user1. Definitivamente esto no es lo que querías. ¿Qué tal agregar este script a crontab para ejecutarlo?como el usuario? Esta sería la línea crontab de root:

 */5      *       * * *   user1    /home/user1/new-service-watch.sh

De esa manera, no tendría que meterse con el doble cambio de usuario. El script se iniciará croncomo user1, luego solo necesita hacerlo sudopara poder ejecutarlo systemctly mantener todo lo demás como ese usuario.

He aquí una idea rápida. ¡Por favor, no lo use tal cual!

editar: cambiar el script para iniciar el servicio como usuario1, por solicitud. eliminado $sudo_cmdde las definiciones exec_starty exec_stop.

*edit2: se debe utilizar chowning sudoen caso de que los archivos sean propiedad del root. Además, se debe detener el servicio sudoen caso de que root haya iniciado el proceso.

#!/bin/bash
sudo_cmd="/usr/bin/sudo" # these are just my paths, change as needed
chown_cmd="$sudo_cmd /usr/bin/chown" # added sudo
systemctl_cmd="/bin/systemctl"
date_cmd="/bin/date"
# if define process before exec_start & exec_stop, 
# you can use it in your exec_start & exec_stop definitions
process="new-service"
exec_start="$systemctl_cmd start $process" # don't sudo so it runs as user1
exec_stop="$sudo_cmd $systemctl_cmd stop $process" # added sudo
check1="/root/testing"
username="user1"
log_file="/var/log/new-service-watch.log" # why not log things? :)

# putting the entirety of the execution in 
# braces lets you pipe it somewhere easily
{ # start_brace
changeOwnership()
{
    echo "$($date_cmd) Changing ownership"
    # there is no need to change directory
    # because we will use '-R' to be recursive
    $chown_cmd -R $username:$username $check1
}

startService()
{
    echo "$($date_cmd) Starting $process"
    $exec_start
    sleep 5
}

stopService()
{
    echo "$($date_cmd) Stopping $process"
    $exec_stop
    sleep 5
}

if ps ax | grep -v grep | grep $process > /dev/null
then
    echo "$($date_cmd) Running...No action needed."
else
    echo "$($date_cmd) Not running...Going to start the service."
    startService
    stopService
    changeOwnership
    startService
fi
} >> "$log_file" # end_brace

información relacionada