Скрипт запуска OSX для монтирования sshfs при входе в систему с помощью файла plist

Я прочитал справочные страницы для 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 jason@iss.nasa.gov:/media/NetworkShare/spacedock-1 /Users/jason/share;
}
mount |grep "/Users/jason/share/"
if [ $? == 1 ] && [ -d "/Users/jason/share" ] && [ $USER == "jason" ]; then
    mount_cosmic
fi

ИЗДАНО ИЗ ОРИГИНАЛЬНОГО ПОЧТЫ:

Если я запускаю скрипт вручную, он выполняется как положено. Могу загрузить плист (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

И файл (отредактированный после принятия совета Гордона ^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>

Махало заранее.

2 ответа

Решение

Благодаря Гордону, помогавшему мне в устранении неполадок, я смог правильно отформатировать файл plist (в итоге я использовал plistEdit pro, потому что plists требовательны к форматированию, а использование текстового редактора мне не помогло) и определил, что в скрипт, который я пытался запустить при входе в систему.

Были две вещи, которые мешали мне. Во-первых, launchd не позволял моему подпроцессу порождения скрипта, необходимому для монтирования каталога sshfs. Это было исправлено добавлением следующей пары ключ-значение:

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

(спасибо tw из сообщения на форуме macworld.com)

Снова благодаря предложениям Гордона я смог прочитать ошибки /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 jason@iss.nasa.gov:/spacedock-1 /Users/jason/share
fi

PLIST

<?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>

Ошибка "нет возвращенного списка" означает, что ему не удалось проанализировать файл.plist. Я вижу две проблемы от руки: Lable должно быть Label, а также </true> должно быть <true/>, Вы можете использовать команду plutil -lint ~/Library/LaunchAgents/local.sshfs_mounts.plist проверить синтаксис plist, хотя он не обнаружит, являются ли данные в plist допустимыми как запускаемый элемент.

Другие вопросы по тегам