(Mac) Автоматически запускать скрипт при входе в систему

#bash #macos #shell

#bash #macos #оболочка

Вопрос:

Из-за маленького диска у меня есть внешний SSD-накопитель USB-C, куда я хочу перенести некоторые программные проекты, над которыми в настоящее время не работаю. Чтобы просмотреть переданные на аутсорсинг проекты в моем каталоге проектов по умолчанию в finder и терминале, я подумал о символической привязке внешних проектов к моей папке по умолчанию. Я попытался использовать fswatch для обнаружения изменений и автоматической символической ссылки на новые папки.

 # watchExternalProjects.sh
fswatch -o /Volumes/SSD/Projects/ | xargs -n1 -I{} ./createSymlinks.sh
  
 # createSymlinks.sh
cd ~/Projects amp;amp; find -L . -name . -o -type d -prune -o -type l -exec rm {}  

ln -s /Volumes/SSD/Projects/* ~/Projects/ 2> /dev/null
  

Это работает, но теперь я хочу автоматически запускать этот скрипт при входе в систему. Я попытался создать приложение Automator, которое вызывает скрипт и помещает его в элементы входа в систему, но наблюдатель не остается активным, а запускается только один раз при входе в систему, и дальнейшие изменения не обнаружены.
Я также попытался настроить агент запуска:

 <?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>com.user.loginscript</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/Documents/Files/watchExternalProjects.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</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>Label</key>
    <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/user/Documents/Files/watchExternalProjects.sh</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/Users/user</string>
    <key>UserName</key>
    <string>user</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.user.loginscript.stdout</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.user.loginscript.stderr</string>
</dict>
</plist>
  

Кажется, это работает, возможно, первый тоже сработал. Но теперь я могу отследить его до ошибки «Операция не разрешена», зарегистрированной в com.user.loginscript.stderr

Комментарии:

1. Я бы рекомендовал задать этот вопрос также в Ask Different apple.stackexchange.com

2. Разве вам не нужно просто выполнить фоновую задачу, добавив amp; в watchExternalProjects.sh ? Я предполагаю, что он завершает процесс fswatch после завершения родительского процесса.

3. @bobdylan Я уже пробовал это с Automator. Не уверен, как это сделать в агенте запуска.

4. Почему бы просто не настроить это как системную службу вместо этого?

5. Насколько я знаю, существует два подхода к написанию системных служб на Mac: Automator и Launch Agent. Последний был бы эквивалентен Linux systemctl на Mac launchctl. Или я что-то пропустил?