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

2844
jason

Я прочитал справочные страницы для 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 

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

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

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

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

3

2 ответа на вопрос

5
Gordon Davisson

The "no plist was returned" error means that it was unable to parse the .plist file. I see two problems offhand: Lable should be Label, and </true> should be <true/>. You can use the command plutil -lint ~/Library/LaunchAgents/local.sshfs_mounts.plist to check the plist syntax, although it will not detect whether the data in the plist is valid as a launchd item.

Ваш пост был самым полезным. Файл plist теперь загружается без проблем, и я могу запустить его с помощью `lanchctl`. Я выложу свой отредактированный код. Проблема теперь в том, что каждый раз, когда я запускаю plist-файл, происходит сбой, и я получаю следующее в `system.log`:` Выход с кодом: 127` jason 10 лет назад 0
Состояние выхода 127 обычно означает, что команда не найдена - это команда sshfs в одной из стандартных директорий PATH или в той, которую вы добавляете, например, в .bash_profile? Если это проблема, либо укажите его полный путь в сценарии (например, `/ usr / local / bin / sshfs jason @ ...`), либо установите PATH соответствующим образом в сценарии. Если это не проблема, попробуйте захватить вывод скрипта, добавив `StandardOutPath/tmp/sshfs_mounts.outStandardErrorPath/tmp/sshfs_mounts.err`к файлу .plist и посмотрите, освещает ли это проблему. Gordon Davisson 10 лет назад 1
Вы помогаете мне избавиться от всех ошибок, но скрипт все равно не запускается. Я изменил сценарий, как вы предложили, а также перенаправил вывод. Я ничего не получаю в `sshfs.out` или` sshfs.err`. Более того, в `/ var / log / system.log` выводится` Throttling respawn: начнется через 10 секунд`. Пример кода обновлен. jason 10 лет назад 0
Я только что заметил, что `KeepAlive` установлен в``, что означает, что если скрипт завершит работу по какой-либо причине, launchd перезапустит его. Выходит ли `sshfs` после монтирования сервера? Если это так (или если оператор `if` не выполнен), это означает, что launchd будет запускать сценарий снова и снова, хотя он снижает частоту повторного запуска каждые 10 секунд. Кроме этого, скрипт успешно монтирует сервер? Если нет, вы должны добавить несколько команд "echo", чтобы получить отладочную информацию, чтобы вы могли понять, что не так? Gordon Davisson 10 лет назад 1
4
jason

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

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

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

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

Опять же, благодаря предложениям Гордона, я смог прочитать ошибки, /tmp/sshfs_mounts.errчтобы обнаружить, что что-то не так с тем, как была написана моя команда. Я провел некоторый поиск по sshfs mounts и нашел информацию о паре сайтов Linux, которые помогли мне составить лучшую команду mount.

Итак, вот что работает.

Автор сценария:

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> 
Круто, я не знал, что мне нужен ключ AbandonProcessGroup. Mikuz 8 лет назад 0

Похожие вопросы