팀을 옮기면서 익히기 시작했던 Chronos. 핵심은 Mesos에서 실행되는 App에 불과하지만 분명 좋은 Tool인 것은 부인할 수 없다. 근데 문제는 Mesos, Chronos 모두 패키징을 제공하지 않아서 사용자가 스스로 BUILD해서 사용해야 한다는 점이다. 그런 부분이 좋은 BIZ Model이 되었는지 MESOSPHERE라는 회사에서 MESOS, CHRONOS를 묶어 PACKAGING을 제공하고 있다.

회사는 CENTOS6 이어서 그에 맞추어 RPM을 설치 했고, GOOGLING을 통해서 /sbin/start , /sbin/stop, /sbin/restart command로 각 Daemon을 start/stop할 수 있게 되었다.

근데 최근에 start option을 일부 수정할 이슈가 생겼는데, 어디를 수정해야 하는지 모르겠다는 점이다.

/sbin/start{stop,restart}를 체크해 보니 결국 /sbin/initctl의 link들이고 아래 article을 보니 /etc/init에 각 daemon 관련 config를 읽어 온다는 정보를 알게 되었다.

http://serverfault.com/questions/489525/linux-how-to-pass-parameters-to-service-foo-start-at-command-line

결국 CHRONOS 실행 Script를 찾았는데... 이 Script에 재밌는 부분이 보인다.

function load_options_and_log {

  set -x

  # Load Chronos options from Mesos and Chronos conf files that are present.

  # Launch main program with Syslog enabled.

  local cmd=( run_jar )

  if [[ -s /etc/mesos/zk ]]

  then

    cmd+=( --zk_hosts "$(cut -d / -f 3 /etc/mesos/zk)"

           --master "$(cat /etc/mesos/zk)" )

  fi

  if [[ -d $conf_dir ]]

  then

    while read -u 9 -r -d '' path

    do

      local name="${path#./}"

      if ! element_in "--${name#'?'}" "$@"

      then

        case "$name" in

          '?'*) cmd+=( "--${name#'?'}" ) ;;

          *)    cmd+=( "--$name" "$(< "$conf_dir/$name")" ) ;;

        esac

      fi

    done 9< <(cd "$conf_dir" && find . -type f -not -name '.*' -print0)

  fi

  logged chronos "${cmd[@]}" "$@"

}


/etc/mesos/zk파일을 읽어 와서 HOST설정하는 건 알고 있었는데, CONF_DIR에 파일들에 대해서 --<파일NAME>=<파일CONTENT>형태의 OPTION을 설정해 주는 부분이 정말 흥미로웠다.

일단 CONF_DIR에 내가 필요한 옵션 이름으로 파일을 만들어서 CHRONOS를 RESTART해 보니 과연 해당 파일 내용을 읽어와서 대몬을 START시켜준다.

항상 느끼는 거지만 SHELL을 잘 사용하면 사용할 수록 개발자들의 편의성이 없어 지는 듯 싶다.

Posted by headiron
,