OSX 运行脚本以使用 plist 文件在登录时挂载 sshfs

OSX 运行脚本以使用 plist 文件在登录时挂载 sshfs

我已经阅读了 plist 和 launchd.plist 的手册页,以及有关使用 plist 文件在登录时运行脚本的帖子;但我似乎可以让事情正常运作。

我的脚本位置和权限:

sshfs_mounts.sh

ls -al Library/scripts/

-rwxr-xr-x   1 jason  staff   288 May 10 17:06 sshfs_mounts.sh

cat Library/scripts/sshfs_mounts.sh

#!/bin/bash
#
## automounting of sshfs directories
mount_cosmic ()
{
    /usr/local/bin/sshfs [email protected]:/media/NetworkShare/spacedock-1 /Users/jason/share;
}
mount |grep "/Users/jason/share/"
if [ $? == 1 ] && [ -d "/Users/jason/share" ] && [ $USER == "jason" ]; then
    mount_cosmic
fi

原始帖子编辑:

如果我手动运行脚本,它会按预期执行。我可以加载 plist ( launchctl load ~/Library/LaunchAgents/local.sshfs.plist) 并启动它 ( launchctl start ~/Library/LaunchAgents/local.sshfs),但它不会运行脚本。在日志 ( cat /var/log/system.log |grep local.sshfs) 中我得到:

May 11 09:30:26 rover com.apple.launchd.peruser.504[305] (local.sshfs.plist): Throttling respawn: Will start in 10 seconds

这是我的 plist 文件的位置和权限:

ls -al Library/LaunchAgents/local.sshfs.plist

-rw-r--r--  1 jason  staff  419 May 10 18:14 Library/LaunchAgents/local.sshfs_mounts.plist

以及文件(采纳 Gordon 的建议^2 后进行了编辑):

<?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>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>local.sshfs.plist</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/Users/jason/Library/scripts/sshfs_mounts.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/sshfs_mounts.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/sshfs_mounts.out</string>
</dict>
</plist>

提前谢谢您。

答案1

“未返回 plist”错误意味着无法解析 .plist 文件。我一眼就看出有两个问题:Lable应该是Label,和</true>应该是<true/>。您可以使用该命令plutil -lint ~/Library/LaunchAgents/local.sshfs_mounts.plist检查 plist 语法,尽管它不会检测 plist 中的数据是否作为启动项有效。

答案2

感谢 Gordon 帮助我排除故障,我能够正确格式化 plist 文件(我最终使用了plist编辑因为 plist 对格式很挑剔,而使用文本编辑器对我来说不起作用),并确定我在登录时尝试运行的脚本中存在问题。

有两件事让我很为难。首先,launchd 不允许我的脚本生成挂载 sshfs 目录所需的子进程。通过添加以下键值对解决了这个问题:

<key>AbandonProcessGroup</key>
<true/>

(感谢 macworld.com 的 tw论坛帖子

再次感谢 Gordon 的建议,我能够从中读取错误,/tmp/sshfs_mounts.err发现我的命令编写方式存在问题。我对 sshfs 挂载进行了一些搜索,并在几个 Linux 网站上找到了帮助我起草更好的挂载命令的信息。

因此,这是有效的方法。

脚本:

mount | grep /Users/jason/share
if [ $? == 1 ] && [ -d /Users/jason/share ]; then
    /usr/local/bin/sshfs -o idmap=user [email protected]:/spacedock-1 /Users/jason/share
fi

清单

<?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>AbandonProcessGroup</key>
    <true/>
    <key>Label</key>
    <string>local.sshfs.plist</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/jason/Library/scripts/sshfs_mounts.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

相关内容