1

Я пытаюсь настроить launchd для запуска исполняемого файла сценария / Unix Python (то есть сценарий Python с линией Shebang). Когда я загружаю файл .plist (ниже), launchctl показывает состояние 127, означающее "Указанный сервис не поставляется с операционной системой". Однако, когда я копирую и вставляю значение, которое я ввел для "программы" в файле .plist, в терминал Mac все работает нормально.

Я перенаправил stdout/stderr в терминал (через .plist), и он возвращает сообщение,

$ env: python3: нет такого файла или каталога

Если я заменю значение Program в plist на простой пакетный скрипт 'hello world', он будет работать нормально.

Почему программа python (urlwatch) нормально работает в терминале, но возвращает ошибку при вызове через launchd? Как мне это исправить?

Плист файл:

<?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>local.careersWatch3</string>
        <key>Program</key>
        <string>/Users/justinmichael/Documents/urlwatch-master/urlwatch</string>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/dev/ttys000</string>
        <key>StandardErrorPath</key>
        <string>/dev/ttys000</string>
    </dict>
</plist>

В конце концов я хочу запускать скрипт в установленное время дня, но сейчас я использую RunAtLoad = true для целей тестирования, пока не смогу заставить его работать.

Загрузка в launchd и вывод:

$ launchctl load  ~/Library/LaunchAgents/local.careerswatch3.plist
$ env: python3: No such file or directory

Позвоните, чтобы проверить статус агента и вывод:

$ launchctl list | grep local.careersWatch3
-   127 local.careersWatch3

Поиск значения кода «127» в терминале:

$ launchctl error 127
127: The specified service did not ship with the operating system

1 ответ1

1

Проблема была с переменными окружения, в частности, что $ PATH отличается для заданий, выполняемых программами cron и vs, которые я вызывал в терминале как вошедший в систему пользователь. Вызов echo $PATH в задании cron и проверка, содержит ли он каталог интерпретатора python, может подтвердить, что это проблема.

Два решения:

1) Быстрый и Грязный

Найдите, где установлен интерпретатор Python, и измените строку shebang в верхней части исполняемого файла / сценария unix, чтобы вызвать его напрямую. т.е.

#!/usr/bin/env python3

становится

#!/usr/local/bin/python3

Здесь не имеет значения, находится ли интерпретатор Python на пути или нет, потому что его местоположение задано явно. Недостатком является то, что его местоположение теперь жестко запрограммировано, и если вы переместите скрипт на другой компьютер, скрипт может не работать ни в cron, ни при запуске в терминале, если python был установлен в другом месте.

2) Менее быстрый, менее грязный

Напишите сценарий оболочки, который добавляет местоположение интерпретатора Python к пути, если его там еще нет (согласно этому вопросу SuperUser), а затем вызывает сценарий Python. Таким образом, сценарий не был изменен и не будет случайно сломан при перемещении его на компьютер, где python установлен в другом каталоге.

#!/bin/bash
# directory python is found in
dir="usr/local/bin"
#add to path if not there
if [ -d "$dir" ] && [[ ":$PATH:" != *":$dir:"* ]]; then
        PATH="${PATH:+"$PATH:"}$dir"
fi
#Run program
/path/to/program/program_name

Обязательно сделайте скрипт исполняемым через chmod +x /path/to/script/script.sh

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .