OSX: 为当前用户加载单个启动代理的语法
OSX: Syntax for loading a single launchagent for current user
我正在尝试加载单个用户的 LaunchAgent plist。目录下所有现有的plist文件都有用户和用户默认组的权限,
如果我对我的 plist 文件使用这些权限并尝试加载,我得到
$ sudo launchctl load -w -F $HOME/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
/Users/timothy/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist: Path had bad ownership/permissions
如果我将权限设置为 root:wheel
,则相同的命令有效。
我想我加载的方式是错误的,所以我尝试了这个:
sudo launchctl load -D user ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Similar result, just lots of `Operation not permitted` instead of `service already loaded`
launchctl load -D user com.ionic.python.ionic-fs-watcher.startup.plist
但是从 100 行的输出来看,它似乎正在尝试加载存在的每个 plist 文件。
该工具的文档似乎表明这只会扫描 ~/Libraries
(见下文),
中的 plist 文件
如何为当前用户加载 LaunchAgent?
$ launchctl help load
Usage: launchctl load <service-path, service-path2, ...>
-w If the service is disabled, it will be enabled. In previous
versions of launchd, being disabled meant that a service was
not loaded. Now, services are always loaded. If a service is
disabled, launchd does not advertise its service endpoints
(sockets, Mach ports, etc.).
-F Forcibly load the service. This flag will ignore the service's
disabled state. In previous versions of launchd, this flag
would also ignore the ownership and permissions of the
specified launchd.plist. This is no longer the case. Note that,
unlike the -w flag, this flag will not modify the service's
disabled state; it will instead only ignore it for the load
operation.
-S <session>
This flag takes a single argument which is the name of a
session and may only be used when loading agents. All daemons
exist within the same session, which is the system session.
Agents may designate which sessions they can be loaded in with
the LimitLoadToSessionType key.
-D <domain>
Loads launchd.plist(5) files from the specified domain.
Depending on the current execution context, launchctl will look
in a LaunchDaemons or LaunchAgents directory for
launchd.plists. When running in the system's execution context
(i.e. when run as root via a root shell or with sudo), the
LaunchDaemons directory is searched. When running in a user's
context (i.e. run normally from a shell), the LaunchAgents
directory is searched. Valid domains are:
system
Searches /System/Library for either daemons or agents.
local
Searches /Library for either daemons or agents.
network
Searches /Network. This session type is no longer valid.
user
Searches the home directory of the calling user for agents
only. Daemons may not be loaded from this
domain.
感谢 James and this excellent blog post 的鼓励,以下是如何在 OSX(或至少在 10.11)上使用单用户 LaunchAgents。
The commands assume a plist file in ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
.
# Enable/disable
launchctl enable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl disable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Loading / unloading
launchctl bootstrap gui/`id -u` ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
launchctl bootout gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Starting
sudo launchctl kickstart -k -p gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Configure the next invocation of the service for debugging
# See `launchctl help debug` for more info
sudo launchctl debug gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup --stdout --stderr
# Stopping
# You can send any valid signal: https://linux.die.net/Bash-Beginners-Guide/sect_12_01.html
launchctl kill SIGTERM gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Get info for process
launchctl print gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# For domain
launchctl print gui/`id -u`
# Enabled/disabled in domain
launchctl print-disabled gui/`id -u`
我正在尝试加载单个用户的 LaunchAgent plist。目录下所有现有的plist文件都有用户和用户默认组的权限,
如果我对我的 plist 文件使用这些权限并尝试加载,我得到
$ sudo launchctl load -w -F $HOME/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
/Users/timothy/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist: Path had bad ownership/permissions
如果我将权限设置为 root:wheel
,则相同的命令有效。
我想我加载的方式是错误的,所以我尝试了这个:
sudo launchctl load -D user ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Similar result, just lots of `Operation not permitted` instead of `service already loaded`
launchctl load -D user com.ionic.python.ionic-fs-watcher.startup.plist
但是从 100 行的输出来看,它似乎正在尝试加载存在的每个 plist 文件。
该工具的文档似乎表明这只会扫描 ~/Libraries
(见下文),
如何为当前用户加载 LaunchAgent?
$ launchctl help load
Usage: launchctl load <service-path, service-path2, ...>
-w If the service is disabled, it will be enabled. In previous
versions of launchd, being disabled meant that a service was
not loaded. Now, services are always loaded. If a service is
disabled, launchd does not advertise its service endpoints
(sockets, Mach ports, etc.).
-F Forcibly load the service. This flag will ignore the service's
disabled state. In previous versions of launchd, this flag
would also ignore the ownership and permissions of the
specified launchd.plist. This is no longer the case. Note that,
unlike the -w flag, this flag will not modify the service's
disabled state; it will instead only ignore it for the load
operation.
-S <session>
This flag takes a single argument which is the name of a
session and may only be used when loading agents. All daemons
exist within the same session, which is the system session.
Agents may designate which sessions they can be loaded in with
the LimitLoadToSessionType key.
-D <domain>
Loads launchd.plist(5) files from the specified domain.
Depending on the current execution context, launchctl will look
in a LaunchDaemons or LaunchAgents directory for
launchd.plists. When running in the system's execution context
(i.e. when run as root via a root shell or with sudo), the
LaunchDaemons directory is searched. When running in a user's
context (i.e. run normally from a shell), the LaunchAgents
directory is searched. Valid domains are:
system
Searches /System/Library for either daemons or agents.
local
Searches /Library for either daemons or agents.
network
Searches /Network. This session type is no longer valid.
user
Searches the home directory of the calling user for agents
only. Daemons may not be loaded from this
domain.
感谢 James and this excellent blog post 的鼓励,以下是如何在 OSX(或至少在 10.11)上使用单用户 LaunchAgents。
The commands assume a plist file in
~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
.
# Enable/disable
launchctl enable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl disable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Loading / unloading
launchctl bootstrap gui/`id -u` ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
launchctl bootout gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Starting
sudo launchctl kickstart -k -p gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Configure the next invocation of the service for debugging
# See `launchctl help debug` for more info
sudo launchctl debug gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup --stdout --stderr
# Stopping
# You can send any valid signal: https://linux.die.net/Bash-Beginners-Guide/sect_12_01.html
launchctl kill SIGTERM gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# Get info for process
launchctl print gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
# For domain
launchctl print gui/`id -u`
# Enabled/disabled in domain
launchctl print-disabled gui/`id -u`