У меня была такая же проблема, и я нашел простой способ решить ее. Я использовал сам по умолчанию usb_modeswitch
, чтобы переключить режим хранения в режим модема.
Двойной щелчок не установит файл .deb
для большинства пользователей. Поэтому используйте команду dpkg
в терминале.
Я разместил все подробности с картинками, чтобы даже новички могли легко решить проблему.
Если вы каждый раз выполняете свои задачи под одним и тем же пользователем, вы можете просто добавить в свой профиль команду выключения, опционально с опцией -P. Число обозначает количество минут, в течение которых команда выключения задерживается. Убедитесь, что у вашего пользователя есть возможность выполнить команду выключения через sudo без пароля.
echo "sudo shutdown -P +60" >> ~/.profile
Добавлено:
После прочтения большинства других ответов мне понравилась возможность добавить «@reboot /<путь к скрипту/команде>» в (root )cron. Ответ, данный sebasth в качестве его четвертого варианта. Вы можете либо добавить команду выключения, либо написать небольшой скрипт, который выполняет выключение и выполняет его через cron. У WoJ также есть отличное решение, если вы используете systemd.
Есть несколько вариантов.
Предоставить время непосредственно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 минут. Таким образом, входы в систему возможны до последнего момента перед выдачей выключения.
В дополнение к комментарию @dirkt вы можете вставить команду at
в свой .bashrc
или .profile
или любой другой файл, который ваша оболочка использует при входе в систему, чтобы запланировать автоматическое завершение работы через 60 минут после вашего входа в систему.
Что-то вроде:
at now + 60 minutes -f /sbin/halt
Попробуйте поместить скрипт(sudo shutdown -P 3600
)в каталог /etc/init.d
, чтобы он запускался автоматически при запуске.
Или попробуйте использовать anacron
, добавив команду в файл /etc/anacrontab
. Я также предлагаю использовать nohup
перед командой, чтобы убедиться, что команда все еще работает после выхода из системы.
Это похоже на задачу 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
.
Если вы действительно беспокоитесь о безопасности, используйте механический таймер розетки на источнике питания. Просто установите его на любое время, когда вы хотите, чтобы он выключился. Таким образом, никто не сможет войти удаленно и отключить выключение. Вам понадобится физический доступ.
Следующий код запускает command
с параметрами, и если он завершится успешно, он немедленно выключит блок, предполагая, что пользователь может запустить poweroff
. Возможно, потребуется использовать sudo poweroff
.
command --parameters && poweroff
В то время как следующий просто запускается poweroff
сразу после завершения команды:
command --parameters ; poweroff
Если вы считаете, что команде требуется время на отдых после завершения, запустите
command --parameters ; sleep 3600 ; poweroff
Если вы считаете, что команда может выполняться слишком долго, вы можете ограничить ее часом:
timeout 1h command --parameters ; poweroff
timeout
является частью пакета coreutils
, поэтому он, вероятно, у вас уже есть.
Если вы работаете на машине 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
во время сеанса, когда он создан, так как он либо не будет работать (, так как не сработал во время перезагрузки ), либо выключится машина сразу, если прошло один час. Я не знаю, какой из них произойдет на самом деле, я никогда не проверял этот конкретный случай.
Если вам нужен сервер только для интерактивных или не-интерактивных задач, запускаемых вашим 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
При использовании этого решения следует помнить о некоторых предостережениях.:
startx
или аналогичного. exit
, вы можете столкнуться с неожиданными завершениями работы. NOPASSWD
для команд выключения или если вы не вызвали sudo -v
перед запуском команды выключения. Короче говоря, вы можете подумать, соответствует ли этот подход вашим реальным потребностям, или лучше использовать совершенно другой подход, такой как мониторинг отсутствия зарегистрированных -пользователей, или какую-либо другую альтернативу. Ваш пробег определенно изменится.
Хотя все предыдущие ответы здесь удовлетворяют требованиям к совершенству, вы также можете отключить питание компьютера, как только задачи будут выполнены.
bash
сценарии могут быть trap
ped, что означает, что определенные сигналы могут быть перехвачены, а определенные задачи могут выполняться при необходимости. EXIT
является одним из сигналов, которые могут быть захвачены.
Вы могли бы:
trap
для EXIT
ваших сценариев автоматической оболочки, что означает завершение ваших автоматизированных задач trap
для вашего .bashrc
EXIT
, то есть всякий раз, когда вы выходите из системы этой машины, выключите ее. Вариант #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
в начале своих скриптов. Если произойдет какая-либо ошибка, она не исчезнет автоматически; он перестанет выполнять больше команд. Сигнал trap
of EXIT
должен охватывать случаи преждевременного завершения работы скрипта из-за ошибок.
Однако для ваших задачэто также может означать, что машина выключится до того, как они будут завершены.
У меня есть простой bash
шаблон, который я использую для облегчения отладки сценариев; может быть, это может быть полезно. См. эту суть .