Skip to main content
added 2 characters in body
Source Link
Aurora0001
  • 6.3k
  • 3
  • 24
  • 39
[Unit]
Description=Disable USB power
Before=baseBefore=basic.target
After=local-fs.target sysinit.target
DefaultDependencies=no
 
[Service]
Type=oneshot
ExecStart=/path/to/script
 
[Install]
WantedBy=baseWantedBy=basic.target
[Unit]
Description=Disable USB power
Before=base.target
After=local-fs.target sysinit.target
DefaultDependencies=no
 
[Service]
Type=oneshot
ExecStart=/path/to/script
 
[Install]
WantedBy=base.target
[Unit]
Description=Disable USB power
Before=basic.target
After=local-fs.target sysinit.target
DefaultDependencies=no
 
[Service]
Type=oneshot
ExecStart=/path/to/script
 
[Install]
WantedBy=basic.target
Source Link
Aurora0001
  • 6.3k
  • 3
  • 24
  • 39

If you're using systemd (which you are if you have Jessie or Stretch), you'll want to create a systemd unit that will run your script as early as possible. In your /lib/systemd/system (note: not /lib/systemd/systemd, unlike some other distributions — see the official Pi docs) directory, create a new file called disableusb.service, containing the following:

[Unit]
Description=Disable USB power
Before=base.target
After=local-fs.target sysinit.target
DefaultDependencies=no
 
[Service]
Type=oneshot
ExecStart=/path/to/script
 
[Install]
WantedBy=base.target

Then, run systemctl enable disableusb, and the script should run on reboot.


Systemd works by running 'units' in order of their dependencies. A chart showing which order units are booted is available on the systemd website, reproduced here for reference:

local-fs-pre.target
         |
         v
(various mounts and   (various swap   (various cryptsetup
 fsck services...)     devices...)        devices...)       (various low-level   (various low-level
         |                  |                  |             services: udevd,     API VFS mounts:
         v                  v                  v             tmpfiles, random     mqueue, configfs,
  local-fs.target      swap.target     cryptsetup.target    seed, sysctl, ...)      debugfs, ...)
         |                  |                  |                    |                    |
         \__________________|_________________ | ___________________|____________________/
                                              \|/
                                               v
                                        sysinit.target
                                               |
          ____________________________________/|\________________________________________
         /                  |                  |                    |                    \
         |                  |                  |                    |                    |
         v                  v                  |                    v                    v
     (various           (various               |                (various          rescue.service
    timers...)          paths...)              |               sockets...)               |
         |                  |                  |                    |                    v
         v                  v                  |                    v              rescue.target
   timers.target      paths.target             |             sockets.target
         |                  |                  |                    |
         v                  \_________________ | ___________________/
                                              \|/
                                               v
                                         basic.target
                                               |
          ____________________________________/|                                 emergency.service
         /                  |                  |                                         |
         |                  |                  |                                         v
         v                  v                  v                                 emergency.target
     display-        (various system    (various system
 manager.service         services           services)
         |             required for            |
         |            graphical UIs)           v
         |                  |           multi-user.target
         |                  |                  |
         \_________________ | _________________/
                           \|/
                            v
                  graphical.target

The earliest you could realistically run your service is after sysinit.target, when the low-level services are initialized, I suspect. The systemd configuration above will execute the script path declared by ExecStart= after sysinit.target is complete, which should be relatively early in the boot sequence.