
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
이 기능에 대한 두 가지 사항:
상황이 순서대로 실행되지 않습니다. 단일은
&
시작 작업을 배경으로 합니다. 정말 그렇게 하고 싶었나요? 프로세스가 완료되어 중지될 때까지 기다리고 싶지 않으십니까? 나는 당신이sleep
s를 넣었다는 것을 알고 있지만 그것이 종료되기를 기다리는 것이 더 낫다고 생각합니다. 명령이 제 시간에 완료되지 않으면 상황이 매우 이상해질 수 있습니다.어떻게 인쇄되지 않았는지 확인하세요
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
만 하면 됩니다 .sudo
systemctl
여기에 간단한 아이디어가 있습니다. 그대로 사용하지 마세요!!!!
편집: 요청에 따라 user1로 서비스를 시작하도록 스크립트를 변경합니다. 및 정의 $sudo_cmd
에서 제거되었습니다 .exec_start
exec_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