
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:
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 ponessleep
s, pero creo que esperar a que salga es mejor. Las cosas podrían ponerse muy extrañas si el comando no terminara a tiempo.Observe cómo no se imprimió
Rest of Script
. Elexit
comando 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 echo
comando no se ejecutó hasta que salí del shell:
[user1]$ exit
logout
/root
[root]$
Incluso entonces, dio el /root
directorio, 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á cron
como user1
, luego solo necesita hacerlo sudo
para poder ejecutarlo systemctl
y 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_cmd
de las definiciones exec_start
y exec_stop
.
*edit2: se debe utilizar chowning sudo
en caso de que los archivos sean propiedad del root. Además, se debe detener el servicio sudo
en 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