2017-01-07 21 views
1

У меня есть этот код:Запустить файл в фоновом режиме от LaunchAgent 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>updater.Keychain.plist.sh</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>bash</string> 
     <string>-c</string> 
     <string>/Users/qwe/Music/meta.sh</string> 
     <string>/Users/qwe/Music/seta.sh</string> 

    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

Дело в том, что «meta.sh» является нескончаемый скрипт, который проверяет каждые 5 минут ли происходит что-то конкретное и, следовательно, «seta.sh» никогда не выполняющиеся , Когда это делается в терминале, я могу просто использовать символ &, чтобы файлы работали в фоновом режиме, но я попытался с &amp; в конце имен файлов, но на самом деле это не сработало. Может ли кто-нибудь помочь мне? Благодаря!!

+3

'seta.sh' не запускается, а не потому, что' meta.sh' никогда не выходит, а потому что это просто еще один аргумент 'bash', специально используемый для установки значения' $ 0', видимого 'meta.sh' , – chepner

+0

Итак, что бы вы сделали, если meta.sh была бесконечной командой? Но seta все еще был файлом –

ответ

0

Комментарий пользователя chepner о непосредственной проблеме: вы передаете имена скриптов, чтобы ошибиться. После опции -c bash ожидает один аргумент, содержащий исполняемую команду (необязательно, после чего следует передать аргументы, начиная с $0). Если вы хотите выполнить несколько команд, вам необходимо объединить их в одну составную команду, например /Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh.

Но я думаю, что вы также используете launchd wrong. Launchd действительно предназначен для запуска процессов, а затем для их мониторинга; это требует, чтобы они оставались на переднем плане. Вещи, которые выходят за рамки запуска, как правило, путают его, приводя к странным проблемам. Например, рассмотрим приведенную выше командную строку. Он запускает meta.sh в фоновом режиме и seta.sh на переднем плане. Вы сказали, что meta.sh - это долговременный процесс, но я полагаю, что seta.sh просто выполняет свою работу и выходит? Если да, то startd увидит, что завершен процесс seta.sh (процесс переднего плана), что любые подпроцессы (meta.sh) остаются оставшимися сиротами и должны «очищать их», т. Е. Убивать их. К сожалению, meta.sh больше не работает.

Если вы действительно хотите, чтобы запускались как meta.sh, так и seta.sh, было бы лучше создать для них два отдельных элемента запуска (т. Е. Два файла .plist).

Если вам нужно запустить их по какой-либо причине, возможно, лучшим способом является создание небольшого скрипта, который запускает оба из них , а затем ждет выхода из и передает этот «скрипт» в bash as параметр -c. Обратите внимание, что это означает, что весь «сценарий» должен быть в одном string в ProgramArguments массиве:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh; wait</string> 
</array> 

Другая возможность добавить AbandonProcessGroup ключ к .plist, а не «сценарий» ждать для фонового процесса, чтобы закончить:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh</string> 
</array> 
<key>AbandonProcessGroup</key> 
<true/> 

... но это имеет тот недостаток, что не запуск программ реализации есть фоновый процесс остался, и при определенных обстоятельствах он может попытаться выполнить задание снова, в результате чего два (или более) фоновых процессов ...

+0

Wow thanks man !! Я понимаю вас, но то, что было двумя разными командами вместо файлов, и первая команда также была бы командой, которая никогда не заканчивалась до тех пор, пока пользователь не закончил команду вручную, не могли бы вы сделать это, у вас есть два создания двух разных plists? Спасибо чувак! –

+0

И у вас нет двух эвакуационных персонажей вроде & с '&'? –

+0

@SUhost: Ой, да, я '&' нужно кодировать; Я исправлю это. Что касается другого вопроса ... мне нужно будет узнать больше о том, чего вы пытаетесь выполнить, о том, какие программы и их отношение друг к другу делают рекомендацию.BTW, так как команды работают по существу в то же время, какая команда «первая» не имеет значения, не так ли? –

 Смежные вопросы

  • Нет связанных вопросов^_^