如何重新启动,例如我的 httpd 或 afpd,运行任何 Mac OS X >= 10.5 (Leopard-),而无需使用 GUI 并转到系统偏好设置 -> 共享并取消选中/选中“网络共享”?
我正在寻找与 Debian 的invoke-rc.d apache2 restart
.
编辑:问题是关于一般的启动控制服务,而不是特别是 Apache(-这只是一个例子)。
如何在 OS X 10.6 上激活启动日志?
我添加了一个无法正常启动的新守护进程(状态为1
)。
我想调试问题,但找不到launchd
日志,它们不在/var/log/launchd.log
.
我很好奇是否可以ProgramArguments
在 Mac OS X Leopard 上的 luanchd 脚本部分指定环境变量。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>me.mpietz.MountDevRoot</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>$HOME/bin/attach-devroot.sh</string>
<!-- Instead of using...
<string>/Users/mpietz/bin/attach-devroot.sh</string -->
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud) launchctl 在 launchctl 列表输出中有一个“状态”列。联机帮助页或任何相关的 launchd 联机帮助页未提及此列或其含义。
我想在启动时(而不是登录时)以特定用户身份运行脚本。我认为 launchd LaunchDaemon 会做到这一点,但 'man launchd' 说:
“如果您希望您的服务作为某个用户运行,在该用户的环境中,使其成为启动代理是在 Mac OS X 上完成此任务的唯一支持的方法。换句话说,执行 setuid(2) 是不够的) 成为真正意义上的 Mac OS X 用户。”
他们不是在开玩笑——当我尝试将我的脚本作为 LaunchDaemon 运行时,它不起作用。特别是,我正在尝试使用“security”命令自动执行一些钥匙串操作,当我通过 LaunchDaemon 运行脚本时,它不会让我更改默认钥匙串,尽管脚本在从 shell 使用 sudo 运行时运行良好。
LaunchAgent 不起作用,因为目标是让进程在没有用户登录的情况下运行,而 LaunchAgents 仅在有人登录时运行。我查看了 cron 和 @reboot 指令,看起来很有希望,但我读到 cron 是在 OSX 上已弃用。
在我们的 Mac OS X (10.6) 服务器上,我们设置了几个由launchd
特定时间控制和启动的备份脚本。为此,我们已经定义了StartCalendarInterval
并且这一切都非常有效。
现在碰巧我想在计划外启动这些作业之一,但这并没有启动作业(但也没有给出错误/警告):
sudo launchctl start org.job-label
Run Code Online (Sandbox Code Playgroud)
launchtl 的联机帮助页指出,start
旨在测试按需作业,没有计划作业的字样。有没有办法启动预定的作业?
得到响应后编辑:是的,手动启动计划作业也可以通过launchctl start
命令进行。
根据launchctl
(强调我的)手册页:
-w 覆盖 Disabled 键并将其设置为 false。在以前的版本中,此选项会修改配置文件。现在禁用密钥的状态存储在磁盘上的其他地方。
由于禁用标志的当前状态不再在.plist
文件本身中设置,因此检查Disabled
密钥不再是判断服务是否会在下次启动时运行的准确方法。
这个“磁盘上的其他地方”在哪里?更重要的是(更重要的是),如何检查是否设置了此标志?
另外,是否可以将服务设置为在下次启动时运行而不强制它立即启动(如launchctl load -w /Library/LaunchDaemons/my-service.plist
)?
有人可以澄清应该如何使用launchdProgram
和ProgramArguments
配置参数吗?我试图在命令行上注册一个服务,我会像这样开始:
$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)
我已经尝试以各种方式将其分配给 launchd:
$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)
或者
<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/service</string>
<string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
或者
<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/service start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
或者
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/python</string>
<string>/foo/bar/baz/service</string>
<string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
以及几乎任何其他似乎有意义的变体。但是,该服务总是因各种不同的错误而失败。唯一有效的方法是使用确切的行创建一个 .sh 脚本并通过 launchd运行它。
因此,要一劳永逸地了解launchd服务:launchd如何使用这两个配置参数,我将如何使用它们复制我的bash命令以及两者之间有什么区别?
或者我可能只是偶然发现了运行这个特定服务的问题,无论是否存在通过 bash 执行它时存在的一些环境变量?服务本身没有提供任何有用的输出。
我已经按照 中的建议查阅了execvp(3)
手册条目launchd.plist(5)
,但这并没有真正加深我的理解。
正如这个答案所建议的那样,我激活了.plist
我生成的文件的日志记录。
<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>
Run Code Online (Sandbox Code Playgroud)
但是,日志文件正在慢慢变大,我想知道是否有办法限制日志在.plist
文件中的大小?
在 OSX 10.6 中,我通过运行 logcheck.sh。使用这个 plist 启动
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>org.logcheck</string>
<key>Program</key><string>/opt/local/bin/logcheck.sh</string>
<key>StartInterval</key><integer>600</integer>
</dict>
</plist>
logcheck 以指定的时间间隔运行,但它不会使用以下命令向我发送邮件:
cat $TMPDIR/checkreport.$$ | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
Run Code Online (Sandbox Code Playgroud)
在哪里
$TMPDIR=/opt/local/var/tmp
$MAIL=/usr/bin/mail
$SYSADMIN=myuser
Run Code Online (Sandbox Code Playgroud)
但是,如果我破解它,并将命令更改为:
cat $TMPDIR/checkreport.$$ > /Users/myuser/report
cat /Users/myuser/report | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
Run Code Online (Sandbox Code Playgroud)
然后我收到邮件。
检查 tmp 的许可,$ls -l /opt/local/var
我得到
drwx------ 20 root admin 680 Jul 12 13:29 tmp/
Run Code Online (Sandbox Code Playgroud)
如果我运行sudo /opt/local/bin/logcheck.sh
第一个命令有效。
如果我/opt/local/bin/logcheck.sh …
launchd ×10
mac-osx ×8
launchctl ×4
osx-leopard ×2
cron ×1
permissions ×1
service ×1
startup ×1