1

Я хотел бы запустить CoffeeScript и Sass-компиляторы в фоновом режиме и иметь возможность убить их обоих одновременно. У меня есть сценарий start bash, например:

coffee --watch -o assets/ -c src/ &
sass --watch src:assets &

При запуске из файла сценария они не отображаются в списке заданий, поэтому я не могу убить их с помощью:

kill `jobs -p`

как предложено в этом посте. Они появляются в выводе ps как прикрепленные к моему tty.

Каков хороший способ убить процессы, запущенные моим start скриптом?

Моя цель - запустить компиляторы с помощью ./start и убить их ./stop . Я использую OSX Lion.

Изменить: на основе ответа Гравити, теперь я использую:

coffee --watch -o assets/ -c src/ &
coffeepid=$!
sass --watch src:assets
kill $coffeepid

Компилятор Sass жалуется, если он остановлен с помощью kill , поэтому я прекращаю его с помощью Ctrl-C, а затем убиваю фоновый компилятор CoffeeScript.

2 ответа2

5

Вы используете MacOS X. Система поставляется с возможностью запуска пользовательских процессов-демонов, запускающих и останавливающих их по желанию. (Правильное название для них в MacOS - пользовательские агенты.) Он launchd, и интерфейс к нему является launchctl. Делайте это один раз за сеанс входа в систему (изменяя имена путей для ваших компиляторов в абсолютную форму соответственно):

 launchctl submit -l com.example.coffee -- ${BINDIR}/coffee --watch -o assets/ -c src/
 launchctl submit -l com.example.sass -- ${BINDIR}/sass --watch src:assets

И в ваших сценариях запуска / остановки:

 launchctl start com.example.coffee
 launchctl start com.example.sass
 launchctl stop com.example.coffee
 launchctl stop com.example.sass

Никаких ужасных pid-файлов, подверженных несчастным случаям. Нет несовпадений grep в таблице процессов. Нет беспорядка Не суетись.

Конечно, вы можете проявить творческий подход со списком свойств и добавить его в свой каталог Library/LaunchAgents , если хотите - простой файл списка свойств не сложно собрать вместе. Но launchctl submit есть для пользовательских агентов nonce, как это.

-2

отфильтровать PID из ps, а затем передать его для уничтожения (в этом примере уничтожение ping):

ps -A | grep ping | awk '{print $1}' | xargs kill

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