2015-04-03 2 views
0

я получил Makefile, который запускает tunslip, как это:Makefile: запустить процесс и сделать что-то еще после того, как процесс полностью начал

connect-router: $(CONTIKI)/tools/tunslip6 
    sudo $(CONTIKI)/tools/tunslip6 -B $(TUNSLIP_BAUD) $(PREFIX) -v6 

То, что я хочу, это то, что после этого tunslip полностью инициализирован, он запускает демона для заполнения некоторых таблиц маршрутизации. То, что я попытался это:

connect-router: $(CONTIKI)/tools/tunslip6 
    @echo "Doing tunslip" 
    sudo $(CONTIKI)/tools/tunslip6 -B $(TUNSLIP_BAUD) $(PREFIX) -v6 
    @echo "Doing routing tables" 
    sudo smcroute -k 
    sudo smcroute -d 

Первое эхо достигнуто, процесс запущен, но другие команды не выполняется, вероятно, потому, что Makefile занят делают этот процесс, не давая второе эха ! Однако мне нужно, чтобы smcroute запускался после того, как туннель полностью инициализирован, поэтому должен быть этот порядок. Как мне это сделать?

Edit:

connect-router: $(CONTIKI)/tools/tunslip6 
    @echo "Doing tunslip" 
    (sudo $(CONTIKI)/tools/tunslip6 -B $(TUNSLIP_BAUD) $(PREFIX) -v6) 
    @echo "Doing routing tables" 
    sudo smcroute -k 
    sudo smcroute -d 
+0

Как сказано [здесь] [1], запустите команду tunslip6 в подоболочке. [1]: http://stackoverflow.com/questions/7668311/makefile-run-processes-in-background – Amessihel

+0

При запуске, как написано сделать только висит на 'tunslip6' линии навсегда? –

+0

Я поместил команду между(), но она все еще не работает. Для получения точного кода см. Мой пост. Редактировать: Не видел вас там! Нет, при запуске как написано процесс tunslip6 просто выполняется, а другие никогда не получают такой возможности. –

ответ

0

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

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

Единственный способ, чтобы одна команда по-прежнему в то время как оболочка запускает следующую команду в то же время, чтобы поставить первую команду в фоновом режиме, и вы делаете это с амперсанд & оператора:

connect-router: $(CONTIKI)/tools/tunslip6 
     @echo "Doing tunslip" 
     sudo $(CONTIKI)/tools/tunslip6 -B $(TUNSLIP_BAUD) $(PREFIX) -v6 & 
     @echo "Doing routing tables" 
     sudo smcroute -k 
     sudo smcroute -d 
+0

Я должен указать, что у вас теперь есть проблема с тем, как остановить этот фоновый процесс ... – MadScientist

+0

Спасибо за идею! Да, у меня теперь действительно есть эта проблема. Мне также хотелось бы видеть результаты этого фонового процесса. Есть идеи? –

+0

Я пробовал это: http://unix.stackexchange.com/questions/104821/how-to-stop-a-background-process Но он не появляется после использования заданий! Таким образом, я не могу выборочно или автоматически привести его в fg. –

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