Агент запуска запускает скрипт каждые 10 секунд

У меня есть агент запуска, который запускает скрипт bash всякий раз, когда подключается USB-устройство. Я хочу, чтобы он запускался только один раз, но когда я подключаю устройство, скрипт продолжает работать каждые 10 секунд.

Вот плист:

<?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>com.example.program</string>
    <key>Program</key>
    <string>/Users/Peter/Desktop/test1.sh</string>
    <key>LaunchEvents</key>
    <dict>
      <key>com.apple.iokit.matching</key>
        <dict>
          <key>com.apple.device-attach</key>
            <dict>
              <key>idProduct</key>
              <integer>1476</integer>
              <key>idVendor</key>
              <integer>1356</integer>
              <key>IOProviderClass</key>
              <string>IOUSBDevice</string>
              <key>IOMatchLaunchStream</key>
              <true/>
            </dict>
        </dict>
    </dict>
</dict>
</plist>

Вот сценарий:

#!/bin/bash
open -a "Spotify";
sleep 11;

Я добавил сон 11, так как я прочитал, что скрипт должен работать не менее 10 секунд, чтобы позволить launchd считать, что он выполнил свою задачу. Однако это никому не помогает.

В запущенном терминале launchctl list com.example.program дает:

"LimitLoadToSessionType" = "Aqua";
"Label" = "com.example.program";
"TimeOut" = 30;
"OnDemand" = true;
"LastExitStatus" = 0;
"Program" = "/Users/Peter/Desktop/test1.sh";

person John Smith    schedule 01.11.2016    source источник


Ответы (1)


По умолчанию launchd запускает программы, когда выполняются условия их запуска, и затем перезапускает их, если они закрываются или аварийно завершают работу. Чтобы он не перезапускал ваш скрипт, просто добавьте <key>KeepAlive</key><false/> в свой .plist (а затем выгрузите и перезагрузите его). Также может быть необходимо добавить <key>AbandonProcessGroup</key><true/>, чтобы launchd не убивал «остаточный» процесс Spotify (хотя я думаю, что это будет работать и без этого).

person Gordon Davisson    schedule 01.11.2016
comment
К сожалению, добавление этих ключей ничего не меняет. Что интересно, я не вижу эти новые ключи, когда запускаю список запуска com.example.program в терминале. Это нормально? - person John Smith; 02.11.2016
comment
@JohnSmith Похоже, вам нужно перезагрузить .plist. Попробуйте launchctl unload /path/to/com.example.program.plist, а затем launchctl unload /path/to/com.example.program.plist. (Примечание: не используйте sudo с ними; это будет рассматриваться как демон, а не как агент.) - person Gordon Davisson; 02.11.2016