Проблема: перезагружать или выключать сервер может только root пользователь. Чтобы бойти это ограничение можно дать возможность пользователям устанавливать флаг на эти действия, который раз в минуту будет считываться root по cron заданию.
Далее описана небольшая конструкция, которая позволяет любому пользователю перезагружать или выключать систему. Её можно модифицировать и ограничить определёнными пользователями, но сама логика будет прежней.
Чтобы всё заработало crontab -e от лица root пользователя ставим в конец:
@reboot /usr/bin/bash /root/sys_action.sh
Этот скрипт будет стартовать с системой, ежеминутно проверяя наличие флага на перезагрузку или выключение от пользователей.
В сам файл /root/sys_action.sh пишем:
# очищаем запланированные операции
echo '' > /tmp/sys_action
# даём доступ всем пользователям
chmod 766 /tmp/sys_action
# бесконечный цикл до тех пор, пока в файле /tmp/sys_action не появится команда, которая считывается раз в 60 секунд
while true
do
if [ -f /tmp/sys_action ]; then
if [[ "$(cat /tmp/sys_action)" == 'reboot' ]]; then
echo 'Перезагрузка сервера';
systemctl reboot;
fi
if [[ "$(cat /tmp/sys_action)" == 'poweroff' ]]; then
echo 'Выключение сервера';
systemctl poweroff;
fi
fi
sleep 60
done
Теперь любой пользователь может вызывать перезагрузку, если выполнит команду:
echo 'poweroff' > /tmp/sys_action
Можно вынести эту команду в алиас, в файл .bashrc в домашней папке пользователя:
alias poweroff='echo "poweroff" > /tmp/sys_action'
Тогда можно будет просто набирать poweroff в консоли и сервер выключится максимум через 60 секунд.