
Estou tentando escrever um script que colocarei no cron job.
O script vai verificar a cada 5 minutos se o processo está rodando, senão tem que iniciar o processo, mas meu problema é que enquanto o processo inicia ele é de propriedade do root e isso altera alguns arquivos em um diretório específico então, eu queria faça o script iniciar o serviço, aguarde 10 segundos e pare o serviço, depois disso ele irá para o diretório específico e alterará a propriedade de todos os arquivos desse diretório e então o script iniciará o serviço novamente.
Espero que minha explicação faça sentido.
Aqui está o que eu descobri até agora. O script funciona para iniciar e parar o serviço, mas atinge o tempo limite quando o serviço é interrompido e não altera nenhuma propriedade no diretório fornecido
#!/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
Aqui está o conteúdo 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
Obrigado
Responder1
Alguns problemas que vejo.
Fiz um script de teste simples:
#!/bin/bash
startAndStop(){
echo "Start 1" &
echo "Sleep 2" && echo "Stop 3"
echo "Sleep 4" && exit
}
startAndStop
echo "Rest of Script"
Isso simula a função startAndStop do seu programa.
Aqui está o resultado:
$ bash test.sh
Sleep 2
Stop 3
Sleep 4
Start 1
Dois pontos sobre esta função:
As coisas funcionam fora de ordem. O único
&
plano de fundo da tarefa inicial. Tem certeza de que queria fazer isso? Você não gostaria de esperar a conclusão do processo para interrompê-lo? Eu sei que você colocousleep
, mas esperar que ele saia é melhor, eu acho. As coisas poderiam ficar muito estranhas se o comando não terminasse a tempo.Observe como não foi impresso
Rest of Script
. Oexit
comando não sai da função, sai de todo o script.
Você tem /usr/bin/sudo su - user1 && $exec_start
. Eu não acho que era isso que você queria fazer. Você define exec_start="sudo systemctl start new-service"
. Então, o que você acaba fazendo é mudar para o usuário1 e, em seguida, elevar as permissões de root para iniciar o serviço. Novo script, na minha máquina. $(pwd)
imprimirá o diretório atual.
#!/bin/bash
sudo su - user1 && /usr/bin/sudo echo $(pwd)
Vamos executá-lo:
[root]$ bash test.sh
[user1]$
Eu tenho uma concha! O&&
aguarda a conclusãodo comando anterior - ou seja sudo su -
, , que fornece um shell de root. O echo
comando não foi executado até que saí do shell:
[user1]$ exit
logout
/root
[root]$
Mesmo assim, deu o /root
diretório, não o /home/user1
. Definitivamente não era isso que você queria. Que tal adicionar este script ao crontab para executarcomo o usuário? Esta seria a linha crontab do root:
*/5 * * * * user1 /home/user1/new-service-watch.sh
Dessa forma, você não teria que mexer com a troca dupla de usuários. O script será iniciado por cron
as user1
, então você só precisa sudo
executar systemctl
e manter todo o resto como esse usuário.
Aqui está uma ideia rápida. Por favor, não use como está!!!!
editar: alterando o script para iniciar o serviço como usuário1, por solicitação. removido $sudo_cmd
das definições exec_start
e exec_stop
.
*edit2: chowning deve ser usado sudo
caso os arquivos sejam de propriedade do root. Além disso, interromper o serviço deve ser usado sudo
apenas no caso de o root ter iniciado o processo.`
#!/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