#!/bin/bash
NOW=$(date +"%s")
SOON=$(date +"%s" -d "3:00 PM Sun")
INTERVAL=$(($SOON-$NOW))
sleep $INTERVAL
GNU date
позволяет указать формат вывода, а также дату для отображения. Поэтому я использую строку формата "% s", чтобы получить время в секундах с начала эпохи, и то же самое для произвольного времени с помощью параметра -d
. Почувствуйте разницу, и у вас есть интервал для сна.
Проверка даты в прошлом оставлена в качестве упражнения для читателя.
fuse
и loop
могут быть загружены автоматически -по запросу.
Поиск показывает, что ядра grsecurity могут блокировать это . Так что есть некоторые разногласия по поводу того, насколько хороша эта идея :-), но я считаю, что она используется в большинстве дистрибутивов.
Если есть временная ошибка с автоматической загрузкой -, можно загрузить fuse
и loop
во время загрузки. Это не создаст конфликт с механизмом автозагрузки -. Любые параметры модуля должны быть установлены в соответствии со строками options
в /etc/modprobe.d/
, независимо от того, кто вызывает modprobe
.
. чтобы убедиться, что loop
загружается
echo 'loop' | sudo tee -a /etc/modules-load.d/modules.conf
Как работает автоматическая -загрузка? Начнем с того, что пользовательское пространство статически создает /dev/fuse
при загрузке, независимо от того, загружен ли модуль. Механизм моей текущей системы немного вычурный -см. /lib/systemd/system/kmod-static-nodes.service
. Итак, у вас есть узел устройства, который вы можете попробовать открыть. Когда вы это сделаете, ядро сначала вызовет загрузку модуля.
В моей системе список узлов устройств, которые создаются статически, чтобы вы могли инициировать загрузку соответствующего модуля ядра,
$ cat /run/tmpfiles.d/kmod.conf
c! /dev/fuse 0600 - - - 10:229
c! /dev/btrfs-control 0600 - - - 10:234
c! /dev/loop-control 0600 - - - 10:237
d /dev/net 0755 - - -
c! /dev/net/tun 0600 - - - 10:200
c! /dev/ppp 0600 - - - 108:0
c! /dev/uinput 0600 - - - 10:223
c! /dev/uhid 0600 - - - 10:239
d /dev/vfio 0755 - - -
c! /dev/vfio/vfio 0600 - - - 10:196
c! /dev/vhci 0600 - - - 10:137
c! /dev/vhost-net 0600 - - - 10:238
c! /dev/vhost-vsock 0600 - - - 10:241
d /dev/snd 0755 - - -
c! /dev/snd/timer 0600 - - - 116:33
d /dev/snd 0755 - - -
c! /dev/snd/seq 0600 - - - 116:1
c! /dev/cuse 0600 - - - 10:203
(Строки d
— это каталоги ).
Вы можете запускать команды при запуске с помощью скрипта systemd. Создайте файл с содержимым
modprobe fuse
modprobe loop
в~/Documents/modprobe_startup.sh
(или в другом месте, где вы хотите его сохранить ). Не забудьте сделать его исполняемым с
chmod +x ~/Documents/modprobe_startup.sh
Теперь мы создаем простой файл службы systemd в /lib/systemd/system/modprobe_startup.service
с содержимым
[Unit]
Description=runs ~/Documents/modprobe_startup.sh
[Service]
Type=simple
ExecStart=/bin/bash /home/USERNAME/Documents/modprobe_startup.sh
[Install]
WantedBy=multi-user.target
Не забудьте заменить USERNAME именем пользователя вашей системы.
Приступаем к установке,
sudo cp /lib/systemd/system/modprobe_startup.service /etc/systemd/system/modprobe_startup.service
sudo chmod 644 /etc/systemd/system/modprobe_startup.service
systemctl enable modprobe_startup.service
и перезагрузите компьютер.