서비스를 다시 시작하기 전에 특정 디렉터리의 소유권을 변경하는 방법

서비스를 다시 시작하기 전에 특정 디렉터리의 소유권을 변경하는 방법

cron 작업에 배치할 스크립트를 작성하려고 합니다.

스크립트는 프로세스가 실행 중인지 아니면 프로세스를 시작해야 하는지 5분마다 확인합니다. 그러나 내 문제는 프로세스가 시작되는 동안 루트가 소유하고 있으며 이로 인해 특정 디렉터리의 일부 파일이 변경된다는 것입니다. 스크립트가 서비스를 시작하도록 한 다음 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로 전환한 다음 서비스를 시작하기 위해 루트 권한으로 승격하는 것입니다. 내 컴퓨터에 새 스크립트가 있습니다. $(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 라인입니다:

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

그렇게 하면 이중 스위치 사용을 망칠 필요가 없습니다. 스크립트는 cron다음 으로 시작됩니다. 그런 다음 실행 하고 다른 모든 것을 해당 사용자로 유지할 수 있도록 하기 user1만 하면 됩니다 .sudosystemctl

여기에 간단한 아이디어가 있습니다. 그대로 사용하지 마세요!!!!

편집: 요청에 따라 user1로 서비스를 시작하도록 스크립트를 변경합니다. 및 정의 $sudo_cmd에서 제거되었습니다 .exec_startexec_stop

sudo*edit2: 루트가 파일을 소유한 경우 chowning을 사용해야 합니다 . 또한 서비스 중지는 sudo루트가 프로세스를 시작한 경우에만 사용해야 합니다.`

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

관련 정보