У меня есть сервер, который обычно отключается по соображениям безопасности. Когда я хочу поработать с ним, я включаю его, выполняю свои задачи и снова выключаю. Мои задачи обычно занимают не более 15 минут. Я хотел бы реализовать механизм автоматического выключения через 60 минут.
Я исследовал, как сделать это с помощью cron, но я не думаю, что это правильный путь, потому что cron не учитывает время последнего включения сервера. Я могу только установить периодические шаблоны, но они не принимают эти данные во внимание.
Как я мог сделать эту реализацию?
at
(разовое исполнение).sudo shutdown -h +60
счетчик, который запустит счетчик обратного отсчета 60 минут для процесса выключения (-halt). Если вы хотите отменить его, вы можетеsudo shutdown -c
(хотя он не использует cron)Ответы:
Если вы каждый раз выполняете свои задачи от имени одного и того же пользователя, вы можете просто добавить команду отключения, опционально с опцией -P, в свой профиль. Число обозначает количество минут, в течение которых команда выключения задерживается. Убедитесь, что у вашего пользователя есть возможность выполнить команду выключения через sudo без пароля.
источник
shutdown -k -P 3600
противshutdown -k -P 60
(-k
печатает сообщение на стене, но не имеет другого эффекта)Есть несколько вариантов.
Предоставьте время напрямую
shutdown -P
:Обратите внимание, что
shutdown
справочная страница также указывает:Используйте
at
команду.Создайте файл модуля systemd или скрипт инициализации, который запускается
shutdown -P 60
при запуске.Используйте cron
@reboot
для запуска команды после загрузки.Добавить в (корневой) crontab:
Для последних двух методов вы также можете использовать
sleep 3600 && shutdown -P now
вместо аргумента time,shutdown
чтобы отложить выключение на 60 минут. Таким образом, вход в систему возможен до последнего момента перед выполнением выключения.источник
sleep
команды вам все еще нужно указать времяshutdown
- мы бы хотели использоватьnow
этот аргумент, если мы уже сделали ожидание (но учтите, что вы не получите слишком много предупреждений, чтобы сохранить свою работу до этого исчезает из-под тебя!).shutdown -P 60
работает это не так, как команда должна быть вызвана. Согласно справочной странице, которую вы должны использоватьshutdown -P +60
. --- Также отключение без аргумента времени (в примереsleep 3600 && shutdown -P
) будет отложено на одну минуту (напримерshutdown -P +1
). Как писал Тоби Спейт, вы, вероятно, захотите использоватьshutdown -P now
.Это похоже на проблему XY .
Если вы завершите работу через 60 минут, вы рискуете столкнуться с особенно сложной проблемой, и вам просто нужно больше времени. Многие из предыдущих решений не позволили бы отложить остановку.
Если задача не является интерактивной, а представляет собой задачу по сценарию, которая автоматически запускается с другого компьютера, @sdkks предоставил для этого отличное решение ; вам действительно нужно просто поручить машине запустить poweroff, как только скрипт и все его задачи завершатся.
Однако, если ваша задача является интерактивной, я бы предложил вместо нее выполнить обнаружение простоя.
Если вы выполняете свою задачу в графическом интерфейсе (X11), вы можете обнаружить незанятые сеансы графического интерфейса, используя описанный здесь подход: выполните команду, когда система находится в режиме ожидания и снова активна
Если вы выполняете задачу через терминал, вы можете обнаружить зарегистрированных пользователей, используя
who
команду. Вы можете настроить cronjob, который выключит машину, еслиwho
вернет пустой результат. Обратите внимание, что это будет довольно консервативный подход; система не выключится, если вы оставите консоль подключенной, но не будет работать.Если вы хотите быть более агрессивным и отключить сеансы бездействующего терминала, вы можете объединить предыдущий подход с автоматическим отключением бездействующих сеансов SSH
ClientAliveInterval
иClientAliveCountMax
. Другой подход для этого, если у вас нет SSH, но есть сеанс локального терминала, это использовать время простоя терминала, возвращаемоеw
командой.источник
Хотя все предыдущие ответы здесь отвечают требованиям к совершенству, вы также можете выключить машину, как только задачи будут выполнены.
bash
сценарии могут бытьtrap
воспроизведены, что означает, что определенные сигналы могут быть перехвачены и определенные задачи могут быть выполнены при необходимости.EXIT
является одним из сигналов, которые могут быть пойманы в ловушку.Вы сможете:
trap
дляEXIT
ваших сценариев автоматической оболочки, что означает прекращение ваших автоматизированных задачtrap
для себя.bashrc
EXIT
, то есть, когда вы выходите из этой машины, выключите его.Вариант № 1 был бы идеальным случаем, если ваши задачи не требуют специального осмотра и ручной оценки.
Вариант № 2 будет охватывать случаи, когда вы забудете выйти из терминала без отключения питания. Есть предостережение, хотя; если у вас открыто несколько терминалов на одной машине, и вы выходите из одной из них, она все равно выключит машину. (Это может быть написано в сценарии, чтобы избежать этого, но я не буду усложнять решение.)
Это может быть в конце
.bashrc
варианта № 2, в верхней части вашего сценария для варианта № 1.Почему бы не использовать
poweroff
в конце сценария?Я предпочитаю использовать
set -eo pipefail
в верхней части моих сценариев. Если произойдет какая-либо ошибка, она не потерпит молчания; это остановит выполнение большего количества команд.trap
отEXIT
сигнала должен охватывать случаи , когда скрипт завершается преждевременно из - за ошибки.Однако для ваших задач это также может означать, что машина выключится, прежде чем они будут завершены.
У меня есть простой
bash
шаблон, который я использую для облегчения отладки скриптов; может быть, это может быть полезным. Пожалуйста, посмотрите эту суть .источник
.bashrc
я бы предпочел основание на случай, если что-то еще перезапишет его. Ваша проблема не ясна, не могли бы вы поделиться примером сниппета на repl.it?Конкретизируя @dirkt комментарий, вы можете вставить
at
команду на ваш.bashrc
или.profile
или любой другой файл , ваша оболочка использует на входе в систему , чтобы запланировать автоматическое отключение через 60 минут после вашего входа в систему .Что-то вроде:
источник
at
. Вы также можете увидетьat
задачи в/var/spool/
at
в этом контексте, потому что он переживает перезагрузки. Если OP войдет в систему, вручную завершит работу и снова войдет в систему в течение часа, он будет выгнан раньше, чем через час после его последнего входа в систему при первом запланированном завершении работы.Следующее выполняется
command
с параметрами, и, если оно завершится успешно, оно немедленно выключит окно, предполагая, что пользователь может работатьpoweroff
. Возможно, потребуется использоватьsudo poweroff
.Принимая во внимание, что следующий просто запускается
poweroff
сразу после завершения команды:Если вы думаете, что команде нужно время отдыха после завершения, запустите
Если вы думаете, что команда может работать сверхурочно, вы можете ограничить ее часом:
timeout
является частьюcoreutils
пакета, так что вы, вероятно, уже имеете его.источник
Если вы действительно беспокоитесь о безопасности, используйте механический таймер на источнике питания. Просто установите его в любое время, когда вы хотите, чтобы он выключился. Таким образом, никто не может войти в систему удаленно и отключить выключение. Вам понадобится физический доступ.
источник
Если вы находитесь в
systemd
машине, вы можете использовать монотонный таймерБлок таймера
/etc/systemd/system/shutdown_after_an_hour.timer
Блок таймера
/etc/systemd/system/shutdown_after_an_hour.service
:Это включено через
Его состояние (в частности, сколько времени осталось до выключения) доступно через
Он будет работать при следующей перезагрузке, он бесполезен для
systemctl start
него во время сеанса, когда он создается, поскольку он либо не будет работать (потому что он не был запущен во время перезагрузки), либо сразу выключит машину, если прошло более часа. Я не знаю, какой из них произойдет на самом деле, я никогда не проверял этот конкретный случай.источник
Попробуйте поставить скрипт (
sudo shutdown -P 3600
) в/etc/init.d
каталог, чтобы он автоматически запускался при запуске.Или попробуйте использовать
anacron
, добавив команду в/etc/anacrontab
файл. Я также предлагаю использоватьnohup
перед командой, чтобы убедиться, что команда все еще работает после выхода из системы.источник
Используйте файл выхода из вашей оболочки
Если вам нужен только сервер для интерактивных или неинтерактивных задач, запущенных вашим UID, попробуйте поместить свои команды выключения в файл ~ / .bash_logout . Руководство по GNU Bash гласит:
Таким образом, добавление sudo poweroff или аналогичного файла выхода из системы приведет к отключению сервера, как только вы выйдете из текущего сеанса или когда вызовет неинтерактивный сеанс Bash
exit
. Вы также можете выбрать для использования в или передать временную задержку выключения , если вы предпочли бы отложить завершение работы.Для более интерактивного подхода к этому вы можете поместить следующие Bashisms в ваш файл выхода из системы:
Предостережения
Есть некоторые предостережения, которые вы должны иметь в виду об этом решении:
startx
или подобным.exit
, вы можете столкнуться с отключениями, которые вы не ожидаете.NOPASSWD
команды выключения, или если вы не звонилиsudo -v
до запуска команды выключения.Короче говоря, вы можете подумать о том, соответствует ли этот подход вашим реальным потребностям, или лучше использовать совершенно другой подход, такой как мониторинг отсутствия вошедших в систему пользователей или какой-либо другой вариант. Ваш пробег определенно будет меняться.
источник