Как я могу выключить сервер Linux после запуска в течение 60 минут?

У меня была такая же проблема, и я нашел простой способ решить ее. Я использовал сам по умолчанию usb_modeswitch , чтобы переключить режим хранения в режим модема.

Двойной щелчок не установит файл .deb для большинства пользователей. Поэтому используйте команду dpkg в терминале.

Я разместил все подробности с картинками, чтобы даже новички могли легко решить проблему.

http://lawrencematthew.wordpress.com/2013/06/21/connecting-ubuntu-12-04-2-to-internet-using-d-link-dwm-156-3g3-75g-usb-modem /

18
04.10.2018, 11:33
10 ответов

Если вы каждый раз выполняете свои задачи под одним и тем же пользователем, вы можете просто добавить в свой профиль команду выключения, опционально с опцией -P. Число обозначает количество минут, в течение которых команда выключения задерживается. Убедитесь, что у вашего пользователя есть возможность выполнить команду выключения через sudo без пароля.

echo "sudo shutdown -P +60" >> ~/.profile

Добавлено:

После прочтения большинства других ответов мне понравилась возможность добавить «@reboot /<путь к скрипту/команде>» в (root )cron. Ответ, данный sebasth в качестве его четвертого варианта. Вы можете либо добавить команду выключения, либо написать небольшой скрипт, который выполняет выключение и выполняет его через cron. У WoJ также есть отличное решение, если вы используете systemd.

23
27.01.2020, 19:45

Есть несколько вариантов.

  • Предоставить время непосредственноshutdown -P:

    shutdown -P +60
    

    Обратите внимание, что справочная страницаshutdownтакже указывает на:

    If the time argument is used, 5 minutes before the system goes down the /run/nologin file is created to ensure that further logins shall not be allowed.

  • Используйте команду at.

  • Создайте файл модуляsystemdилисценарий инициализации , который запускает shutdown -P 60при запуске.

  • Используйте cron@rebootдля запуска команды после загрузки.

    Добавить в (корень )crontab:

    @reboot shutdown -P +60
    

Для последних двух методов вы также можете использовать sleep 3600 && shutdown -P nowвместо аргумента времени для shutdown, чтобы отложить выключение на 60 минут. Таким образом, входы в систему возможны до последнего момента перед выдачей выключения.

69
27.01.2020, 19:45

В дополнение к комментарию @dirkt вы можете вставить команду atв свой .bashrcили .profileили любой другой файл, который ваша оболочка использует при входе в систему, чтобы запланировать автоматическое завершение работы через 60 минут после вашего входа в систему.

Что-то вроде:

at now + 60 minutes -f /sbin/halt
4
27.01.2020, 19:45

Попробуйте поместить скрипт(sudo shutdown -P 3600)в каталог /etc/init.d, чтобы он запускался автоматически при запуске.

Или попробуйте использовать anacron, добавив команду в файл /etc/anacrontab. Я также предлагаю использовать nohupперед командой, чтобы убедиться, что команда все еще работает после выхода из системы.

1
27.01.2020, 19:45

Это похоже на задачу XY .

My tasks take usually no more than 15 minutes. I would like to implement a mechanism to shutdown it automatically after 60 minutes.

Если вы отключитесь через 60 минут, вы рискуете столкнуться с особенно сложной проблемой, и вам просто нужно больше времени. Многие из предыдущих решений не позволяли легко отложить завершение работы.

Если задача не является интерактивной, а представляет собой задачу по сценарию, которая автоматически запускается с другого компьютера, @sdkks предоставил отличное решение для этого; вам действительно нужно просто дать машине задание запустить poweroff, как только скрипт и все его задачи закончатся.

Однако, если ваша задача является интерактивной, я бы предложил вместо этого выполнить обнаружение бездействия.

Если вы выполняете свою задачу в графическом интерфейсе (X11 )вы можете обнаружить простаивающие сеансы графического интерфейса, используя подход, описанный здесь:Запуск команды, когда система простаивает и когда она снова активна

Если вы выполняете задачу через терминал, вы можете обнаружить вошедших в систему пользователей с помощью команды who. Вы можете настроить cronjob, который выключит машину, если whoвозвращает пустой результат. Обратите внимание, что это будет довольно консервативный подход; он не выключит систему, если вы оставили консоль подключенной, но бездействующей.

Если вы хотите действовать более агрессивно и также отключать простаивающие терминальные сеансы, вы можете комбинировать предыдущий подход с автоматическим отключением простаивающих сеансов SSHClientAliveIntervalи ClientAliveCountMax. Другой подход для этого, если у вас нет SSH, но есть локальный сеанс терминала, заключается в использовании времени простоя терминала , возвращаемого командой w.

32
27.01.2020, 19:45

Если вы действительно беспокоитесь о безопасности, используйте механический таймер розетки на источнике питания. Просто установите его на любое время, когда вы хотите, чтобы он выключился. Таким образом, никто не сможет войти удаленно и отключить выключение. Вам понадобится физический доступ.

3
27.01.2020, 19:45

Следующий код запускает commandс параметрами, и если он завершится успешно, он немедленно выключит блок, предполагая, что пользователь может запустить poweroff. Возможно, потребуется использовать sudo poweroff.

command --parameters && poweroff

В то время как следующий просто запускается poweroffсразу после завершения команды:

command --parameters ; poweroff

Если вы считаете, что команде требуется время на отдых после завершения, запустите

command --parameters ; sleep 3600 ; poweroff

Если вы считаете, что команда может выполняться слишком долго, вы можете ограничить ее часом:

timeout 1h command --parameters ; poweroff

timeoutявляется частью пакета coreutils, поэтому он, вероятно, у вас уже есть.

5
27.01.2020, 19:45

Если вы работаете на машине systemd, вы можете использовать монотонный таймер

Таймер/etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

Таймер/etc/systemd/system/shutdown_after_an_hour.service:

[Unit]
Description=shutdown after an hour

[Service]
ExecStart=/sbin/poweroff --force --no-wall
Type=oneshot

Включается через

# systemctl enable shutdown_after_an_hour.timer

Его статус (, в частности, сколько времени осталось до выключения ), доступен через

# systemctl list-timers shutdown_after_an_hour.timer

Он будет работать при следующей перезагрузке, не имеет смысла systemctl startво время сеанса, когда он создан, так как он либо не будет работать (, так как не сработал во время перезагрузки ), либо выключится машина сразу, если прошло один час. Я не знаю, какой из них произойдет на самом деле, я никогда не проверял этот конкретный случай.

1
27.01.2020, 19:45

Используйте файл выхода из вашей оболочки

Если вам нужен сервер только для интерактивных или не-интерактивных задач, запускаемых вашим UID, подумайте о том, чтобы поместить команды выключения в файл~/.bash _выхода . В GNU Bash Manual говорится:

When an interactive login shell exits, or a non-interactive login shell executes the exit builtin command, Bash reads and executes commands from the file ~/.bash_logout, if it exists.

Таким образом, добавление «sudo poweroff» или аналогичного в ваш файл выхода приведет к отключению сервера , как только вы выйдете из текущего сеанса или когда не -интерактивный сеанс Bash вызовет exit. Вы также можете использовать в или указать время -задержки для выключения , если вы предпочитаете отложить выключение.

Для более интерактивного подхода вы можете поместить следующие Bashisms в свой файл выхода:

# Shutdown unless N or n is pressed within 30 seconds.
shopt -s nocasematch
read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
[[ "$REPLY" =~ n ]] || sudo poweroff

Предостережения

При использовании этого решения следует помнить о некоторых предостережениях.:

  • Это, вероятно, будет работать даже под терминалом, запущенным X Windows, но, вероятно, не будет работать для сеанса X11, который не был запущен с помощью startxили аналогичного.
  • Если у вас есть не -интерактивные сценарии, вызывающие exit, вы можете столкнуться с неожиданными завершениями работы.
  • Ваш файл sudoers может запросить пароль, если вы не указали NOPASSWDдля команд выключения или если вы не вызвали sudo -vперед запуском команды выключения.
  • Вероятно, есть и другие пограничные случаи, о которых я еще не подумал.

Короче говоря, вы можете подумать, соответствует ли этот подход вашим реальным потребностям, или лучше использовать совершенно другой подход, такой как мониторинг отсутствия зарегистрированных -пользователей, или какую-либо другую альтернативу. Ваш пробег определенно изменится.

1
27.01.2020, 19:45

Хотя все предыдущие ответы здесь удовлетворяют требованиям к совершенству, вы также можете отключить питание компьютера, как только задачи будут выполнены.

bashсценарии могут быть trapped, что означает, что определенные сигналы могут быть перехвачены, а определенные задачи могут выполняться при необходимости. EXITявляется одним из сигналов, которые могут быть захвачены.

Вы могли бы:

  1. Установите trapдля EXITваших сценариев автоматической оболочки, что означает завершение ваших автоматизированных задач
  2. Установите trapдля вашего .bashrcEXIT, то есть всякий раз, когда вы выходите из системы этой машины, выключите ее.

Вариант #1 был бы идеальным случаем, если ваши задачи не требуют специальной проверки и ручной оценки.

Опция #2 предназначена для случаев, когда вы забываете выйти из терминала, не выключив питание. Однако есть предостережение; если у вас открыто несколько терминалов для одной и той же машины, и вы выходите из одного из них, он все равно выключит машину. (Этого можно избежать, но я не буду усложнять решение.)

cleanup(){
    # Do some tasks before terminating
    echo oh la la, cleaning is so nice
    echo "See you later, world"
    sudo poweroff & # finally shutdown
}
trap cleanup EXIT

Это может быть в конце .bashrcдля опции #2, где-то вверху вашего скрипта для опции #1.

Почему бы не использовать poweroffв конце скрипта?

Я предпочитаю использовать set -eo pipefailв начале своих скриптов. Если произойдет какая-либо ошибка, она не исчезнет автоматически; он перестанет выполнять больше команд. Сигнал trapof EXITдолжен охватывать случаи преждевременного завершения работы скрипта из-за ошибок.

Однако для ваших задачэто также может означать, что машина выключится до того, как они будут завершены.

У меня есть простой bashшаблон, который я использую для облегчения отладки сценариев; может быть, это может быть полезно. См. эту суть .

8
27.01.2020, 19:45

Теги

Похожие вопросы