Неможливо запустити демон в ланцюзі startctl в Yosemite


27

У мене розміщений стартовий демон, ~/Library/LaunchAgentsякий добре працював у Мавериках. Але вона не розпочнеться в публічній бета-версії Yosemite. Демон-пліст такий (моє ім’я користувача darksairз UID 501)

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

В основному він повинен працювати ~/bin/retrmail.pyкожні 5 хвилин.

Я зауважую, що в Yosemite launchd оновлений до 2.0, а в startctl є нові команди. я намагався

sudo launchctl kickstart user/501/org.darksair.retrmail

і воно сказало

Could not find service "org.darksair.retrmail" in domain for uid: 501

Я також спробував стару школу

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

і воно сказало

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Файл належить мені та групі працівників. Я спробував і дозвіл 644 і 600 з однаковою помилкою.

Так хтось знає, як правильно підпалити демон, що запускається, в Йосеміті?


ОНОВЛЕННЯ: Схоже, має належати моєму файлу агента запуску root:wheel. Після того, як я відмовився, я спробував

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

і це не видало жодної помилки. І я думаю, що мій Деймон працює належним чином. Залишаю це питання відкритим, бо пам'ятаю, що в запущеному документі чітко зазначено, що файл агента запуску може бути власником користувача, який управляє демоном.


UPDATE2: Ні, він не працював належним чином. Він запустився лише один раз, але не знову, як ніби він був вивантажений.


ОНОВЛЕННЯ3: Я перейшов на версію бета-версії Yosemite public 3 і змінив свого агента на це

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Я перезавантажив цей агент, і я думаю, що зараз він працює належним чином. Я все ще залишаю це питання відкритим, тому що я не знаю, що не так з моїм попереднім списком.


На закінчення, що я виявив, що я повинен змінити власника плістера root:wheel, щоб завантажити його.


Чи працює це у фіналі Йосеміті?
TJ Luoma

@TJLuoma: так. Поки пліст належить корінь: колесо.
MetroWind

Відповіді:


21

З man launchctl

Зауважте, що файли конфігурації для кожного користувача (LaunchAgents) повинні бути власниками root (якщо вони розташовані в / Бібліотека / LaunchAgents) або користувач, який завантажує їх (якщо вони знаходяться в $ HOME / Бібліотека / LaunchAgents). Усі загальносистемні демони (LaunchDaemons) повинні володіти коренем. Файли конфігурації повинні забороняти запис групи та світу. Ці обмеження діють з міркувань безпеки, оскільки дозволяють спрацьовувати робочий файл для запущеного файлу конфігурації, можна вказати, який виконуваний файл буде запущений.

Виправити є

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
"Або користувач завантажує їх" <- Це частина, з якою я маю проблеми.
MetroWind

2
Я не хлопець з Unix, але це говорить "заборонити групувати та писати по всьому світу". Оскільки це, можливо, ще потрібно прочитати, чи не так chmod 644?
Джейсон

5

Як не дивно, використання sudoвашої проблеми було. Використовуючи sudo, ви більше не були самим собою, тому ви не були власником власного файлу. Видаліть sudo, повторіть команду, і вона повинна завантажуватися просто чудово. Вибачте за філософський підхід до всього цього.


4

Знайшов рішення.

Правильна команда в цьому випадку така

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

І вивантажити,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Не знаю, для чого launchctl loadпотрібен root, але завантаження / вивантаження все одно застаріло.


Man page містить список завантаження, а не завантаження. Я думаю, що автокорекція отримала вас, оскільки на моїй машині він змінює завантажувальну систему на завантаження.
Стів Мозер

@MetroWind Я не можу знайти домен для помилки Code = 112 з вищевказаною командою. його не відповідає. якась підказка?
Параг Бафна

Вам все-таки потрібні chmod& chown?
Ітачі

@Itachi, ні. Залишити власника та дозволу за замовчуванням має бути добре.
MetroWind

@ParagBafna, я не впевнений. Можливо, ваш UID не 501?
MetroWind

3

Натрапив на це теж, намагаючись використовувати користувацький, а не власник root .plist (як це слід робити)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Мене віддалено запустили в цю машину, поки я НЕ входив у консоль (без голови), що, здавалося, є моєю проблемою - принаймні, для керованих користувачем служб потрібен користувач, який увійшов на головний екран (я закінчила це робити вхід у систему за допомогою дистанційного керування, оскільки це безголівковий апарат)

IMO, якщо ви хочете, щоб це було запущено, навіть якщо ви особисто не знаходитесь, щоб увійти, ви можете:

  • Зробіть авторизацію в обліковому записі автоматично (зверніть увагу на значення безпеки, також без тегу UserName, як зазначено в одній з відповідей)

  • Створіть файли root, як зазначено в різних пропозиціях (встановлення ефективного повернення користувача до вашого за допомогою UserName, як у вас є)


2
Дуже дякую. Я знайшов рішення у вашій відповіді.
Відновлення

2

Ось дурна думка.

У мене просто була така ж помилка, також після переходу на Йосеміті. Я помилково припустив, що це означає погані права власності / дозволу на файл .plist, коли насправді чомусь двійковий файл, на який я посилався в плісті (у моєму випадку «кассандра»), втратив свій виконуваний біт.

chmod + x'ing це виправили.

Напевно, це не ваша проблема, але, можливо, варто було б зняти :)


Однак це не стосується мого випадку. Мій виконуваний файл має біт дозволу x. Але все-таки подякуйте за відповідь. Сподіваюся, це може допомогти іншим людям.
MetroWind

2

Видаліть UserNameключ і рядок.

Проблема полягає в тому, що UserNameключ можна використовувати лише в тому випадку, якщо процес запускається root. Його можна запустити як root, лише якщо пліст належить root. В основному процес запускається root, а потім підходить до вказаного користувачем. Якщо ви хочете, щоб цей процес запускався як власний, покладіть список у свою папку ~ / Library / LaunchAgents та видаліть ключ UserName.


Він працює після видалення параметра "UserName" для zabbix_agend. Дякую! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Дивно ... Він все одно не завантажиться після того, як я видалив річ "UserName" ...
MetroWind

1

Чи намагалися ви вручну перезавантажити агент, який мав дозволи користувача? Я не зовсім розумію, для чого потрібно щось із цього, але я вважаю, що вам потрібно приєднатися до домену користувачів (що, здається, ви не прив’язані до запуску як root). Використання цих функцій для повторного приєднання працювало для мене.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Ви б використовували це так:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexec повертає вас у свій домен і дає змогу додавати завдання в якості запуску користувачів.


Там написано: /Users/darksair/Library/LaunchAgents/retrmail.plist: Операція вже триває. На даний момент мої запитання в основному: чому команда kickstart не спрацювала? І чому я повинен встановити право власності на пліст корінь…?
MetroWind

1
НЕ ВИКОРИСТОВУЙТЕ власника файлу плістів на root; все в ~ / Бібліотеці / LaunchAgents має належати користувачеві, якому цей каталог належить. Я отримав операцію, що вже триває, коли я не вивантажував команду, перш ніж завантажувати її. Ви використовуєте функцію, яку я надав?
imalison

Так. Я використовував ваші функції. І я спочатку вивантажив
пліст

Я просто спробував завантажити перший список, який ви надали, і він працював на мене. Які дозволи встановлені для файлу?
imalison

Це неймовірний фрагмент коду для такої кількості речей. Я використовую суміш маріонеткових та користувацьких скриптів bash для управління багатьма різними пристроями macOS, а випадкові проблеми, оскільки сеанс аудиту безпеки чи домен користувача невірні, такі поширені. Чудова робота!
Ендрю Білий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.