Applications and processes can start automatically on login on macOS,
and there are a number of different ways to enable or disable
auto-launching code. For example, a user could check for apps in System
Preferences > Users & Groups > Login Items
. However, this does not show
all auto-starting code. Even popular apps, such as Spotify, [1] might not
appear in System Preferences. Another idea is to check the common
directories /Library/Launch* ~/Library/Launch*
; however, these are not
guaranteed to contain the auto-launching code either. [2]
Check for auto-launching code on macOS by running launchctl list
, for
example:
launchctl list | grep -v '\tcom.apple.'
Even though the command above filters out code identified with Apple
(com.apple.
), some results may still be core macOS code. Note that
some identifiers may be prefixed with application
, and these should
probably be ignored. Check for macOS code that does not have a
com.apple.*
identifier, by searching the /System/Library/Launch*
directories—which are part of macOS and protected by System Integrity
Protection (SIP)—as
follows:
ls -a /System/Library/Launch* | grep -v '^com.apple.'
If a service shown using the launchctl list
command—let’s say it is
called com.example.launch-service
—is not a macOS service and should
be disabled, then run the following command to prevent it from launching
on the next login:
launchctl disable gui/`id -u`/com.example.launch-service
In order to see the full list of disabled services, [3] run:
launchctl print-disabled user/`id -u`
For more information on using launchctl
on macOS, there is a blog post
by Babo D called “LAUNCHCTL 2.0 SYNTAX” from 2016. [4] In addition to
seeing code that starts automatically, it may also be interesting to
inspect the kernel extensions that have been loaded using the
kextstat
.
Putting this all together, a bash alias called help
combines all of
these steps in order to quickly check for auto-launching code (as well
as kernel extensions):
alias help="kextstat | awk '"'!'"/ com.apple./{print \$6}' ; \
launchctl list | grep -v '\tcom.apple.' ; \
echo 'usage: launchctl disable gui/\`id -u\`/com.example.launch-service' ; \
ls -a /Library/Launch* ~/Library/Launch* "
Note: Updated on Feb 28, 2021 to properly escape the
!
in the bash alias.