Как изменить владельца определенного каталога перед перезапуском службы

Как изменить владельца определенного каталога перед перезапуском службы

Я пытаюсь написать скрипт, который поместлю в задачу cron.

Скрипт будет проверять каждые 5 минут, запущен ли процесс, если нет, он должен запустить процесс, но моя проблема в том, что при запуске процесса его владельцем является пользователь root, который изменяет некоторые файлы в определенном каталоге, поэтому я хотел, чтобы скрипт запускал службу, затем ждал 10 секунд и останавливал службу, после чего он перейдет в определенный каталог и изменит владельца всех файлов в этом каталоге, а затем скрипт снова запустит службу.

Надеюсь, мое объяснение понятно.

Вот что я придумал на данный момент. Скрипт работает для запуска и остановки службы, но он отключается, когда служба останавливается, и не меняет владельца в указанном каталоге

#!/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

Вот содержимое /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

Спасибо

решение1

Я вижу пару проблем.

Я сделал простой тестовый скрипт:

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

Это имитирует функцию startAndStop вашей программы.

Вот что получилось:

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

Два момента относительно этой функции:

  1. Все выполняется не по порядку. Одиночный &фон запускает задачу. Вы уверены, что хотите это сделать? Разве вы не хотите дождаться завершения процесса, чтобы остановить его? Я знаю, что вы ввели sleeps, но, по-моему, лучше дождаться его завершения. Все может стать очень странным, если команда не завершится вовремя.

  2. Обратите внимание, что он не вывел Rest of Script. exitКоманда не завершает функцию, она завершает весь скрипт.

У вас есть /usr/bin/sudo su - user1 && $exec_start. Я не думаю, что это то, что вы хотели сделать. Вы устанавливаете exec_start="sudo systemctl start new-service". Поэтому в итоге вы переключаетесь на пользователя user1, а затем повышаете права до root, чтобы запустить службу. Новый скрипт на моей машине. $(pwd)распечатает текущий каталог.

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

Давайте выполним это:

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

Я получил ракушку!&& ждет завершенияпредыдущей команды - а именно sudo su -, которая дает root shell. echoКоманда не была выполнена, пока я не вышел из shell:

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

Даже тогда он дал /rootдиректорию, а не /home/user1. Это определенно не то, что вы хотели. Как насчет добавления этого скрипта в crontab для запускакак пользователь? Это будет строка crontab пользователя root:

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

Таким образом, вам не придется возиться с двойным переключением пользователей. Скрипт будет запущен как cron, user1затем вам просто нужно sudoбудет запустить его systemctlи сохранить все остальное как этого пользователя.

Вот краткая идея. Пожалуйста, не используйте как есть!!!!

правка: изменение скрипта для запуска службы от имени пользователя user1 по запросу. удалено $sudo_cmdиз определений exec_startи exec_stop.

*edit2: chowning следует использовать sudoв случае, если файлами владеет root. Также, остановку службы следует использовать sudoтолько в случае, если root запустил процесс.

#!/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

Связанный контент