Разрешить запуск процесса только между часами x и y

TL; DR. Ваш сценарий запуска ничего не делает, потому что он уже "запущен", - сообщает systemd. Вам нужно остановить его, тогда вы можете запустить его.

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

sudo /etc/init.d/usbstorage start

в ОС, используя systemd в качестве предпочтительного менеджера, что является вашим случаем, тогда строка

. /lib/lsb/init-functions

в вашем SysV- style вызывает выполнение кода оболочки в

/lib/lsb/init-functions.d/40-systemd

. Он в основном видит, что вам нужен systemd, эквивалентный вашему файлу, поэтому печатает

Starting usbstorage (via systemctl)

, затем запускает

/bin/systemctl start usbstorage.service

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

Однако каждый раз, когда кто-то вызывает systemctl daemon-reload , все сценарии /etc/init.d / * анализируются, и для каждого из них создается небольшой файл модуля systemd. их в / run / systemd / generator / (при загрузке) или /run/systemd/generator.late/ .

Блок комментариев ### BEGIN INIT INFO каждого скрипта преобразуется в эквивалентные зависимости systemd. Юнит-файл для вашего скрипта, usbstorage.service, будет включать эти строки

RemainAfterExit=yes
ExecStart=/etc/init.d/usbstorage start
ExecStop=/etc/init.d/usbstorage stop

Следовательно, последний / bin / systemctl запускает usbstorage.service , выпущенный непосредственно перед завершением выполнения вашего скрипта, просто снова запустит ваш скрипт с arg start , как вы только что сделали. На этот раз среда содержит _SYSTEMCTL_SKIP_REDIRECT = true , поэтому включение 40-systemd не вызовет дополнительной рекурсии, и вместо этого ваш сценарий будет выполняться как обычно.

Так почему он ничего не делает при запуске?

Все это находится в строке RemainAfterExit = yes . Это заставляет systemd запоминать тот факт, что start был выполнен, и поэтому, когда вы запускаете другой start , он ничего не будет делать, потому что он уже запущен и «работает».

Сначала вам нужно выполнить stop , затем ваш start фактически полностью запустит ваш скрипт. Вы можете проверить текущее состояние вашего сервиса, например:

$ sudo systemctl status usbstorage.service
* usbstorage.service - LSB: Automounts external storage if found.
   Loaded: loaded (/etc/init.d/usbstorage)
   Active: active (exited) since Thu 2016-07-28 15:37:24 CEST; 26min ago
  Process: 7977 ExecStart=/etc/init.d/usbstorage start (code=exited, status=0/SUCCESS)

Jul 28 15:37:23 three usbstorage[7977]: <stdout/stderr of your script>

Обратите внимание, что там написано active (exited) . Вы можете посмотреть в журнале сообщения с

sudo journalctl -u usbstorage
3
26.05.2015, 18:11
0 ответов

Теги

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