1

Я пытаюсь написать сценарий, который я добавлю в 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 ответ1

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. Вещи выполняются не по порядку. Сингл & фоны стартовой задачи. Вы уверены, что хотите это сделать? Не хотите ли вы дождаться завершения процесса и начать его останавливать? Я знаю, что ты включил sleep , но, думаю, лучше дождаться его выхода. Все может стать очень странным, если команда не успеет вовремя.

  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 - , которая дает корневую оболочку. Команда echo не была выполнена, пока я не покинул оболочку:

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

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

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

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

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

edit: изменение скрипта для запуска сервиса от имени 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .