현재(2008.02.26) OS X에서 동작하지 않아 수정하여 다시 올렸습니다. 여기서 다운로드 받으셔서 사용해 주세요.


사용자 삽입 이미지
올블로그에 종종 놀러 가다가 문득 위젯이 있으면 좋을 것 같아 만들어 보았습니다.

대쉬코드로 만들려고 실행을 했더니 베타가 익스파이어드 되었다고 실행이 안되네요.  그래서 그냥(?) 대충 만들어서 설정 부분이나 모양이 안좋습니다.
 
아래와 같이 10개의 오늘의 추천글을 보여 주며, 제목을 클릭하면 해당 포스트로 연결됩니다.
사용자 삽입 이미지

설정은 간단합니다. 올블로그로 부터 데이터를 확인하는 시간(간격) 설정과 올블로그 링크를 삭제(올블로그 툴바가 안 나옵니다)하고 링크하는 옵션이 있습니다.
사용자 삽입 이미지

아래의 파일을 다운로드 받으셔서 클릭하시고 설치하시면 됩니다.

AND

1. 다운로드
MySQL 다운로드 사이트에서 현재 사용하시는 맥의 CPU와 OS X 버젼에 맞는 패키지를 선택하고 다운 받습니다. 여기서는 package format을 다운 받고 이를 예로 들겠습니다.

해당 파일에서 Pick a Mirror를 클릭하면 회원가입 또는 로그인 화면이 나옵니다. 로그인이나 회원가입을 안하실 분은 하단의 "» No thanks, just take me to the downloads!"를 클릭하면 다운로드 받을 수 있는 미러사이트들이 나옵니다. 이 중 선택하셔서 다운로드 받으시면 됩니다.

2. 설치
사용자 삽입 이미지
다운로드 받은 dmg 파일을 클릭하면 아래와 같은 파일들이 나옵니다.
 
mysql-5***.pkg  : mysql 설치 파일
MySQL_S**.pkg  : 부팅 시 자동 시작 설정 파일
MySQL_pre*.pkg : 시스템 환경설정 등록 파일
ReadMe.txt          : 설치 안내 파일

설치는 매우 쉽습니다. 아래와 같이 각각의 파일들을 클릭하여 설치 합니다.

1) 먼저 mysql-5.0.**.pkg 파일을 클릭하여 MySQL을 설치 합니다.
2) MySQL_Startup**.pkg 파일을 클릭하여 설치합니다.
3) MySQL_prefPane을 클릭하여 환경설정에 MySQL을 추가 합니다.

이제 모든 설치가 완료되었습니다. 시스템 환경설정/기타에서 MySQL 아이콘을 확인하고 클릭합니다.
사용자 삽입 이미지

 위의 화면에서 [Start MySQL Server] 버튼을 클릭하여 MySQL을 시작하고, 위의 화면과 같이 상태가 running임을 확인 합니다.  아래의 체크 옵션은 시스템 시작 시에 MySQL을 자동으로 시작할지를 선택합니다. 필요에 따라서 체크를 하시면 됩니다.
 
3. 설정
이제 MySQL이 실행되고 있는지 확인해 보겠습니다. iTerm등의 터미널을 실행 합니다.
(지금 부터의 내용이 어려우신 분들은 제 이전 포스트를 참고 하세요.)

MySQL은 /usr/local/mysql-[버젼명] 디렉토리에 설치되어 있으며, 해당 디렉토리에서 mysql로 심볼릭 링크되어 있습니다.

사용 상의 편의를 위해 MySQL 실행(bin) 디렉토리를 패스에 추가 합니다. 사용자 root 디렉토리에서 > vi .bash_profile로 열어 아래와 같이 한줄을 추가 합니다.

PATH=${PATH}:/usr/local/mysql/bin
위의 내용을 입력하고 :wq로 저장하고 vi를 나옵니다.
 
다시 터미널로 로그인 하여 > sudo mysql 타이핑 하면, 아래와 같은 MySQL이 실행 된 화면을 보실 수 있습니다. (패스워드 입력창이 나오면 root권한 사용 시 입력하는 패스워드를 입력하시면 됩니다.)
사용자 삽입 이미지

4. Database, 사용자 추가
1. 데이터 베이스 생성
위의 프롬프트 상에서 mysql> create database cocoadev[enter]를 입력하여 cocoadev란 데이터베이스를 생성합니다.

2. 사용자 등록
mysql> grant all privileges on cocoadev.* to test@"localhost" identified by '1111';
와 같이 입력하여 localhost(현재 컴퓨터)의 test 사용자를 패스워드 1111로 생성하여  cocoadev 데이터베이스에 접근할 수 있도록 합니다.

아래와 같이 진행됨을 확인합니다.
사용자 삽입 이미지

quit 명령어로 mysql을 나옵니다.

3. 사용자 로그인
이제 위에서 등록한 test 사용자로 mysql에 로그인 해 보겠습니다.

> msyql -u [userid] -p[password] [database]과 같이 로그인 하며 위의 이미지를 참고 하시면 됩니다. 아래와 같이 정상적으로 mysql에 로그인 되는지 확인 하시면 됩니다.

사용자 삽입 이미지

자세한 사항은 패키지의 ReadMe.txt를 읽어 보시고, 그외 자세한 설명은 mysql 사이트의 메뉴얼을 참고 하세요.

여기서는 나중에 Cocoa Tutorial에서 MySQL과 연동하는 어플리케이션을 제작할 때 다루어 보겠습니다.

AND

이전에 급조해서 만들어 놓았던 리눅스용 서버 프로세스 감시 어플리케이션 소스 입니다. 실행되면 특정 프로세스가 실행 되는지 검사하다 프로세스가 없으면 정해진 파일을 다시 실행합니다.

proc 파일 시스템을 이용하기 때문에 이 소스로는 proc 파일 시스템을 사용하지 않는 맥 OS X에서는 동작하지 않습니다. 현 소스는 Linux에서 사용했고 freeBSD에서도 디렉토리와 몇 가지만 바꾸면 사용하는데 이상이 없을 겁니다. 원래 freeBSD에서 사용했던 것을 Linux로 옮겨 왔습니다.

일단 소스입니다. 보시면 알겠지만 제가 있던 환경만을 생각해서 만들었고, 여러 상황이나 오류에 대한 고려가 없으니 만약 사용 시에는 아래의 사항을 반드시 확인해 보세요.
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
    
/* 검사 주기(초) */
#define CHECK_SECOND        30  

/* 실행 서버 패스 및 이름 */
#define APP_PATH            "/root/ztsvr/ztsvr"
#define APP_NAME            "ztsvr"

int check_process();
void get_timef(time_t, char *);

int main()
{
    int rt;
    time_t  the_time;
    char buffer[255];
    char app[255];

    sprintf(app, "nohup %s &", APP_PATH);

    printf("START\n");
    fflush(stdout);
    while(1)
    {
        time(&the_time);
        get_timef(the_time, buffer);

        rt = check_process();

        if(rt == 0)
        {
            printf("DIE: %s\n", buffer);

            /** 새로 뛰움 **/
            system(app);
            printf("RELOAD: %s\n", buffer);
        }
        else
        {
            printf("OK: %s\n", buffer);
        }

        fflush(stdout);
       
       /* 검사 후, process sleep */
        sleep(CHECK_SECOND);   
    }
    return 0;
}

/** 프로세스 검사 */
int check_process()
{   
    DIR* pdir;
    struct dirent *pinfo;
    int is_live = 0;

    pdir = opendir("/proc");
    if(pdir == NULL)
    {
        printf("err: NO_DIR\n");
        return 0;
    }

    /** /proc 디렉토리의 프로세스 검색 */
    while(1)
    {
        pinfo = readdir(pdir);
        if(pinfo == NULL)
            break;

        /** 파일이거나 ".", "..", 프로세스 디렉토리는 숫자로 시작하기 때문에 아스키코드 57(9)가 넘을 경우 건너뜀 */
        if(pinfo->d_type != 4 || pinfo->d_name[0] == '.' || pinfo->d_name[0] > 57)
            continue;

        FILE* fp;
        char buff[128];
        char path[128];

        sprintf(path, "/proc/%s/status", pinfo->d_name);
        fp = fopen(path, "rt");
        if(fp)
        {
            fgets(buff, 128, fp);
            fclose(fp);

            /** 프로세스명과 status 파일 내용과 비교 */ 
            if(strstr(buff, APP_NAME))
            {
                is_live = 1;
                break;
            }
        }
        else
        {
            printf("Can't read file [%s]\n", path);
        }
    }

    closedir(pdir);

    return is_live;
}

/** 현재 시간을 설정 */
void get_timef(time_t org_time, char *time_str)
{
    struct tm *tm_ptr;
    tm_ptr = localtime(&org_time);

    sprintf(time_str, "%d/%d/%d %d:%d:%d",
                    tm_ptr->tm_year+1900,
                    tm_ptr->tm_mon+1,
                    tm_ptr->tm_mday,
                    tm_ptr->tm_hour,
                    tm_ptr->tm_min,
                    tm_ptr->tm_sec);
}

0. 용도
서버 자체가 든든 해서 어떠한 상황에서도 죽는 일이 없어야 겠지만, 중요한 서비스라면 일단 자동으로 살려 놓고 원인을 찾아야 할 경우를 위해 만들어 놓았습니다.

1. 설정
#define CHECK_SECOND        30  
검사 주기를 초단위로 설정합니다. 이 설정으로는 검사를 한 후 30초 sleep상태로 잠들어 있다 30초 마다 다시 검사합니다.

#define APP_PATH            "/root/ztsvr/ztsvr"
실행해야 될 서버 실행파일의 전체경로와 파일명입니다.

#define APP_NAME            "ztsvr"
실행 프로세스명(파일명) 입니다.

sprintf(app, "nohup %s &", APP_PATH);
system 합수로 실행해야될 명령어를 설정합니다. 참고로 nohup [실행파일 패스] &로 실행을 하면 실행파일은 백그라운드에서 실행되며 터미널의 연결이 종료되어도 계속 실행됩니다.

콘솔 출력 내용은 생성되는 nohup.out 파일 에서 확인할 수 있습니다. 위에서 printf로 출력되는 내용은 모두 nohup.out에 저장됩니다.

2. 주의 사항
if(strstr(buff, APP_NAME))
위와 같이 strstr로 간단한 검사만 합니다. "abc"란 프로세서가 죽었더라도 "abcdef"란 프로세스가 있으면 살아 있는 것으로 간주됩니다.  서버 이름이 절대 중복되지 않으면 상관 없지만, 안전을 위하여, 해당 시스템의 stat 파일의 포멧을 보고 파싱해서 정확하게 검사해야 할 것 입니다.

nohup.out 파일의 크기
검사 주기가 작고 출력되는 내용이 많을 경우에는 nohup.out 파일의 크기가 지나치게 커질 수 있습니다. 콘솔로 출력되는 양을 줄이거나 주기적으로 파일의 크기를 체크해야 합니다.

2000년 초 제작 하여 몇 번을 사용 해 보고 이상이 없었으나, 백그라운드에서 while로 항시 돌아 가며 시스템에 접근하는 프로그램이기 때문에 사용 시 많은 테스트와 올바르게 동작 하는지 확인을 하셔야 합니다.

이 소스를 이용해서 일어나는 피해에 관해서는 일절 책임을 지지 않으니, 주의해서 사용하시기 바랍니다.

AND