So ändern Sie den Eigentümer eines bestimmten Verzeichnisses, bevor Sie einen Dienst neu starten

So ändern Sie den Eigentümer eines bestimmten Verzeichnisses, bevor Sie einen Dienst neu starten

Ich versuche, ein Skript zu schreiben, das ich in einen Cron-Job einfüge.

Das Skript prüft alle 5 Minuten, ob der Prozess ausgeführt wird. Wenn nicht, muss es den Prozess starten. Mein Problem besteht jedoch darin, dass der Prozess beim Start root gehört und einige Dateien in einem bestimmten Verzeichnis ändert. Daher wollte ich, dass das Skript den Dienst startet, dann 10 Sekunden wartet und den Dienst stoppt. Danach geht es in das angegebene Verzeichnis und ändert den Besitz aller Dateien in diesem Verzeichnis. Anschließend startet das Skript den Dienst erneut.

Ich hoffe, meine Erklärung ist verständlich.

Hier ist, was mir bisher eingefallen ist. Das Skript funktioniert, um den Dienst zu starten und zu stoppen, aber es läuft ab, wenn der Dienst stoppt, und ändert keine Eigentümerschaft im angegebenen Verzeichnis.

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

Hier ist der Inhalt von /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

Danke

Antwort1

Ich sehe ein paar Probleme.

Ich habe ein einfaches Testskript erstellt:

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

Dies simuliert die Start- und Stoppfunktion Ihres Programms.

Hier ist die Ausgabe:

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

Zwei Punkte zu dieser Funktion:

  1. Die Dinge werden in der falschen Reihenfolge ausgeführt. Die einzelnen &Aufgaben stellen die Startaufgabe in den Hintergrund. Sind Sie sicher, dass Sie das tun wollten? Möchten Sie nicht warten, bis der Prozess abgeschlossen ist, bevor Sie ihn stoppen? Ich weiß, dass Sie sleeps eingegeben haben, aber ich denke, es ist besser, zu warten, bis es beendet wird. Es könnte sehr seltsam werden, wenn der Befehl nicht rechtzeitig beendet wird.

  2. Beachten Sie, dass es nicht gedruckt wurde Rest of Script. Der exitBefehl beendet nicht die Funktion, sondern das gesamte Skript.

Sie haben /usr/bin/sudo su - user1 && $exec_start. Ich glaube nicht, dass Sie das wollten. Sie haben exec_start="sudo systemctl start new-service". Sie wechseln also zu Benutzer1 und erhöhen dann die Berechtigungen auf Root, um den Dienst zu starten. Neues Skript auf meinem Rechner. $(pwd)druckt das aktuelle Verzeichnis.

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

Lassen Sie es uns ausführen:

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

Ich habe eine Muschel! Die&& wartet auf die Fertigstellungdes vorherigen Befehls - nämlich sudo su -, das eine Root-Shell ergibt. Der echoBefehl wurde erst ausgeführt, als ich die Shell verließ:

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

Selbst dann wurde das /rootVerzeichnis angezeigt, nicht /home/user1. Das ist definitiv nicht das, was Sie wollten. Wie wäre es, dieses Skript zu crontab hinzuzufügen, um es auszuführenals Benutzer? Dies wäre die Crontab-Zeile von Root:

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

Auf diese Weise müssen Sie sich nicht mit doppeltem Benutzerwechsel herumschlagen. Das Skript wird als gestartet cron, user1dann müssen Sie nur noch sudoausführen systemctl, damit Sie alles andere als diesen Benutzer behalten können.

Hier ist eine schnelle Idee. Bitte nicht so verwenden, wie es ist!!!!

Bearbeiten: Skript ändern, um Dienst gemäß Anforderung als Benutzer1 zu starten. $sudo_cmdAus den exec_startund exec_stopDefinitionen entfernt.

*edit2: chowning sollte verwendet werden sudo, wenn die Dateien root gehören. Außerdem sollte der Dienst sudonur dann gestoppt werden, wenn root den Prozess gestartet hat.`

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

verwandte Informationen