pkill для java-процессов на Windows

Written by elwood

batch-file

Часто бывает нужно убить процесс java, но именно тот, который был запущен с определёнными параметрами (т.к. в системе могут быть запущено несколько java-процессов). Для этого в unix-мире есть удобная команда pkill, которая выполняет то же самое, что и команда

ps | grep glassfish | awk '{print $2}' | xargs kill

А в Windows таких удобных команд нет. Стандартная команда tasklist не умеет выводить аргументы, с которыми были запущены процессы. Зато есть входящая в JDK утилита jps, которая умеет это делать для java-процессов. Нет grep, но есть FindStr. Нет возможности распарсить вывод с помощью awk, но есть FOR /F. Итак, несмотря на скудный инструментарий, мы всё же что-то можем сделать.

Примеры использования (Нужно предварительно добавить JDK\bin в PATH):

javakill glassfish

Находит java-процесс, в JVM-опциях содержащий строку glassfish, и убивает его, если он такой один. Если же найдено несколько подходящих процессов, будет запрошено подтверждение завершения первого из них.

javakill glassfish /Q

То же самое, но в случае неоднозначности первый подходящий процесс будет завершён без запроса подтверждения.

javakill glassfish /A

Если будут найдены несколько подходящих процессов, будет запрошено подтверждение на завершение их всех.

javakill glassfish /Q /A

Будут завершены все подходящие процессы без запроса подтверждений.

Howto set up git mirror of your mercurial repo

Written by elwood

This guide covers a process in Windows with TortoiseHG as mercurial client.

Install git, generate ssh keys

  • Install git
  • Sign up for github
  • Generate ssh keys and store it into ~/.ssh
  • Upload ssh keys to your github account
  • Create git repo

Install hg-git extension

  • Install python3 and set up PATH to python bin directory
  • Clone hg-git plugin source code
  • Add full path to hg-git source code to ~/mercurial.ini
    [extensions]
    hggit = c:\Users\Igor\hg_plugins\hg-git\hggit

    Without trailing slash !

Configure mercurial’s putty to use git ssh key

  • Generate key pair file for putty (import existing keys and export as ppk)
    using puttygen tool
  • Add ssh key parameter to [ui] section of ~/mercurial.ini
    [ui]
    ssh=TortoisePlink.exe -i "c:\Users\Igor\.ssh\elwood.ppk"

Push changesets to it!

  • Run commands inside your hg repo:
    $ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
    $ hg push git+ssh://git@github.com:elw00d/consoleframework.git
  • If your mercurial commits are not recognized in github as yours, check the email of your git ssh key
    and email of committers. They should be equal to allow github detect that it was you.

Congratulations, you now have a mirror of your mercurial repo !

Support your mirror in actual state

If you have pulled some changesets from another hg repo, you may to want to push it to git. But your master bookmark needs to be “fast-forwarded”. To do this, use a command

$hg bookmark master

After that you can push to git repo again. Btw, usually if you run hg pull && hg update, bookmark will be updated automatically.

Console Framework на Mac OS X

Written by elwood

Решил, что пора бы добавить поддержку макоси тоже. Всё портирование свелось к нескольким простым вещам:

  • Собрать libtermkey. Под мак mono почему-то исключительно 32-битный, поэтому нужно следить за разрядностью выходного dylib-модуля. По сути достаточно в майкфайл добавить CCFLAGS += -arch i386 -arch x86_64 (я собирал fat binary) и выполнить make. Если не указать i386, скорее всего будет собран 64-разрядный модуль, и моно не сможет его загрузить для интеропа, будет сбивающий с толку DllNotFoundException (на самом деле dll found, но просто не может быть загружена).
  • Найти libncurses и сделать для него symlink. Сам пакет может быть установлен при помощи MacPorts. У меня он автоматически поставился при установке midnight commander (через MacPorts)
  • Убрать eventfd в качестве объекта-источника poll-сигналов. Заменил на self-pipe.
  • Корректно проставить symlinks к оставшимся библиотекам (libc.so). Или прописать dllmap в App.config-файле – моно умеет оттуда распарсивать пути к библиотекам.

Всё в принципе работоспособно, но, к сожалению, качество эмуляторов терминала под Mac оставляет желать лучшего..

(more…)