Я вижу проблемы с парой.
Я сделал простой тестовый скрипт:
#!/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
, но, думаю, лучше дождаться его выхода. Все может стать очень странным, если команда не успеет вовремя.
Обратите внимание, как не печатался 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