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