• c# 숫자만 입력 textbox string 문자열 정규표현식 영어 숫자만 가져오기

    c# 숫자만 입력 textbox string 문자열 정규표현식 영어 숫자만 가져오기

    C# 숫자만 입력 하기 위해서 정규표현식을 사용하여 알고리즘을 만들었습니다.

    제가 필요한 부분은 이렇게 많은 영어와 숫자중에서 grp-a001-01-000000xxxxxxx 로 시작하는 항목만 필요하였으며 이를 정규표현식으로 아래처럼 만들었습니다.

    그냥 드래그로 쭈욱~~ 복사하고 이것을 프로그램에 입력하면 알아서 grp-a001-01-000000xxxxxxx로 되어진 항목만 빼오는것이죠.

    아래처럼 왼쪽 textBox 항목에 위의 클립아트 text를 붙여넣으면 알아서 원하는 패턴 항목만 가져옵니다.

    C# 소스파일 다운받기

    grp-a001-01-0000000000000.zip

    Regex.Matches(“검색할문자열”, pattern)

    패턴에 아래 [ 괄호 안 ] 내용을 입력하여 사용하면됩니다.

    위의 소스코드 다운받아서 직접 해보시면 어떻게 동작하는지 알 수 있습니다.

    c# 숫자만 입력 C#숫자만 가져오기

    [0-9]

    C#영어만 가져오기 (대소문자 모두 가져옵니다)

    [a-zA-Z]

    C#숫자 영어 문자만 가져오기

    [a-zA-Z0-9]

    간단하게 린크드리스트(LinkedList) 와 정규표현식(RegularExpressions )을 사용하였습니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace grp_a001_01_0000000000000
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
    //grp-a001-01-000000023156551
    
    LinkedList<string> linkedList_groupStringAll = new LinkedList<string>();
    LinkedList<string> linkedList_groupStringUnique = new LinkedList<string>();
    
    string pattern = "(grp-)(?<groupString>[a-zA-Z0-9]{4}-[0-9]{2}-[0-9]{15}?)";
    MatchCollection matches = Regex.Matches(textBox1.Text, pattern);
    
    textBox2.Text = string.Empty;
    int matchesIndex = 0;
    foreach (Match match in matches)
    {
    
    if (match.Groups["groupString"].Length > 0)
    {
    linkedList_groupStringAll.AddLast(match.Groups["groupString"].Value); 
    }
    }
    
    foreach (string groupListEachItem in linkedList_groupStringAll)
    {
    int compareIndex = 0;
    foreach (string groupListEachItem_compare in linkedList_groupStringAll)
    {
    if(groupListEachItem.Equals(groupListEachItem_compare))
    {
    if(compareIndex++ > 2)
    {
    break;
    }
    }
    }
    
    if(compareIndex == 1)
    {
    linkedList_groupStringUnique.AddLast(groupListEachItem);
    }
    }
    
    
    matchesIndex = 0;
    foreach (string groupListEachItem in linkedList_groupStringUnique)
    {
    if (++matchesIndex == linkedList_groupStringUnique.Count)
    {
    textBox2.AppendText(string.Format("{0}", groupListEachItem));
    }
    else
    {
    textBox2.AppendText(string.Format("{0}\r\n", groupListEachItem));
    }
    }
    
    textBox2.AppendText(string.Format("\r\n총:{0,0}개", linkedList_groupStringUnique.Count));
    
    
    }
    }
    }

    전체 소스파일은 제가 올려놓았으니 필요하신분들은 다운받아서 사용해보시기 바랍니다.

  • jquery click 이벤트 안됨 동적 페이지 적용 방법

    jquery click 이벤트 안됨 동적 페이지 적용 방법

    jquery click 이벤트 안됨 해결 방법이며 이미 해결한 상태입니다

    jquery click 이벤트 안됨

    동적 페이지 생성으로 인해서 과거 동작하던 jqeury 구문이 안되는 일이 발생하였습니다.

    $("#selector").click(function(){
        alert("OK");
    });

    ID 값을 선택자로 잡아서 클릭 이벤트를 실행하더라도 이벤트가 안됩니다.

    정적 페이지에서는 잘 되는데 동적으로 새로 생성된 페이지에서는 위의 코드로는 동작하지 않습니다.

    그럴때에는 click 이벤트보다 아래처럼 on 이벤트를 이용하여 깔끔하게 해결됩니다.

    $(document).on("click", ".scroll_to", function(){
        event.preventDefault();
        $('html,body').animate({scrollTop:$(this.hash).offset().top}, 1000);
    });

    on(“click”, “선택자”, function(){});

    jquery click 이벤트 안됨

    위의 소스코드는 워드프레스에서 scroll_to 클래스를 클릭할때 자동으로 그 위치로 부드럽게 이동하는 소스코드입니다.

    처음에 click() 이벤트를 사용했을때에는 경고창조차 뜨지 않았습니다.

    아무래도 워드프레스 페이지는 정적인 페이지보다 동적으로 페이지가 만들어지다보니 동적 페이지에서 동작하는 on 이벤트를 사용하면 됩니다.

    간단하게 아래처럼 소스코드로 jQuery 클릭 이벤트가 동적하는지 확인해보세요.

    $(document).on("click", "선택자", function(){
        alert("동작확인");
    });

    jQuery 동적 페이지 클릭 이벤트 해결되셨죠?

    혹시 안되는 부분 있으시면 저에게 바로 알려주시기 바랍니다.

    감사합니다.

  • 워드프레스 홈페이지 자동 광고 위젯 만들기

    워드프레스 홈페이지 자동 광고 위젯 만들기

    광고 위젯 만들기 php언어 입니다

    광고 위젯 만들기 소개

    워드프레스 홈페이지를 구경하다보면 사이드 위젯이 자동으로 바뀌는 광고를 보셨을겁니다.

    혹시 못보셨다면 티온스테이션에서 F5 번을 클릭해보시기 바랍니다.

    아니면 지금 이 블로그 리눅스맨 워드프레스에서도 오른쪽 사이드광고를 보시면됩니다.

    광고 위젯 만들기

    아도비 위젯이 광고로 나오고 있음을 볼 수있습니다.

    보통 제휴마케팅 광고를 등록하게되면 그 위치에는 내용을 수정하지 않는 이상 계속 그 광고만 노출됩니다.

    제휴마케팅 뿐만 아니라 특정 배너광고도 마찬가지입니다. 한번 등록한 이미지, 광고 내용은 수정전에는 다른 광고로 바꿀수가 없습니다.

    하지만 오늘 제가 알려드리는 방법은 여러가지 광고를 임의로 넣어두고 랜덤하게 혹은 특정 조건에 맞춰서 원하는 광고를 더 많이 나오도록 할 수 있는 방법입니다.

    PHP 코드를 이용하는 방법이라 다소 프로그래머가 아니라면 어려워보일수도 있겠지만

    플러그인 설치와 위젯등록만 할 수 있다면 누구든지 따라할수 있을정도로 쉽습니다.

    숏코드 방법으로 할수도 있지만 이 방법으로 하게되면 더 혼란과 어려움으로 이어질것같아 오늘은 PHP CODE 플러그인을 이용해서 쉽게 알려드릴께요.

    워드프레스 위젯 자동광고 등록 방법

    1. PHP Code Widget 플러그인을 설치합니다.

    플러그인에서 php code widget 이라고 검색하면 나옵니다. 아래처럼 이미지가 <? 이렇게 생긴 플러그인을 설치하면됩니다.

    설치를 하셨다면 따로 더이상 세팅할 무언가가 있진않습니다. 그냥 설치 그 자체로 php 구문을 사용할수 있습니다.

    설치가 되었다면 꼭 활성화 버튼까지 눌러주셔야합니다.

    2. php위젯을 등록합니다.

    만약 워드프레스 테마가 제가 운영하는 블로그와 달라 위와같은 모양이 아니라면 아래처럼 외형 -> 위젯 항목에 들어가셔서 추가할 수 있습니다.

    PHP Code 라고 적힌 위젯을 마우스로 (왼쪽클릭) 꾹 눌러서 드래그(이동)시키면 됩니다.

    아래처럼 따라하면 쉽게 위젯을 등록할 수있습니다.

    3. 아래 php코드를 입력합니다.

    위젯을 등록하였다면 Title 과 본문내용을 넣을 수 있는 공간이 나타납니다.

    타이틀에는 제목을 적으시고요 (생략가능하니 적지 않아도 됩니다.)

    본문 내용에 자신의 상황에 맞게끔 수정해서 넣으시면됩니다.

    <?php
    $randomX = rand(0,10);
    switch($randomX)
    {
    case 0:
    ?>
    광고코드 (또는 이미지) 1
    <?php
    break;
    case 1:
    ?>
    광고코드 (또는 이미지) 2
    <?php
    break;
    case 2:
    ?>
    광고코드 (또는 이미지) 3
    <?php
    break;
    case 3:
    ?>
    광고코드 (또는 이미지) 4
    <?php
    break;
    default:
    ?>
    광고코드 (또는 이미지) 5 (기본설정)
    <?php
    break;
    }
    ?>

    위의 php 코드를 제가 설명을 잠깐 드리면 이렇습니다.

    $randomX = rand(0,10);

    빨강색으로 변수명을 randomX 라고 칭했습니다. 이곳에 0부터 9까지 숫자가 임의로 랜덤하게 적용됩니다.

    예를들어 F5를 누르면 $randomX 값이 5가 될수도 있고 1이 될수도 있고 0 또는 9가 될수도 있다는 이야기입니다.

    이렇게 특정 값을 배정받게 되어 1이 적용될 경우 case 1: 항목의 광고를 보여주는것입니다.

    위의 코드를 잘 보면 case가 0부터 3까지가 있고 default 이렇게 총 5가지의 경우의수가 있습니다.

    랜덤숫자가 0,1,2,3 이렇게 나올경우 광고코드 (또는 이미지) 1 ~ 광고코드 (또는 이미지) 4 까지 적용됩니다.

    하지만 4부터 10까지의 숫자에 대해서는 광고코드 (또는 이미지) 5 (기본설정) 적용됩니다.

    결국 랜덤숫자가 0부터 10까지 총 11개중 1개를 추출하기때문에 Default로 지정된곳이 상대적으로 많이 보여주게되죠.

    대략 65%정도는 이곳 기본을 보여주고 나머지 대략 9% 확률로 각각 0,1,2,3 경우를 보여주게됩니다.

    그래서 많이 보여주고 싶은 광고를 Default에 넣고 0,1,2,3 경우에는 조금 노출빈도가 낮지만 그래도 가끔 광고가 다르게 보여주고 싶을때 넣는다고 보면되죠.

    만약 아래처럼 rand(0,1) 이렇게 지정하고 경우의수를 모두 지우고 case 0과 1만 놔둔다면… 50%의 확률로 그 두개의 광고만 나오게됩니다.

    <?php
    $randomX = rand(0,1);
    switch($randomX)
    {
    case 0:
    ?>
    광고코드 (또는 이미지) 1
    <?php
    break;
    case 1:
    ?>
    광고코드 (또는 이미지) 2
    <?php
    break;
    }
    ?>

    이 방법을 통해서 다양한 광고를 위젯에 걸어서 사이드바가 더욱 풍성한 워드프레스를 운영해보시기 바랍니다.

    꼭 스크립트 아니더라도 img 이미지에 링크 걸어서 다양한 배너도 만들수 있습니다.

    위젯 등록도중에 궁금한 부분이 있다면 언제든지 제 블로그에 댓글로 자세한 설명과 함께 남겨주시면 제가 알고 있는 범위내에서 답변을 드리도록 하겠습니다.

    감사합니다.

  • 아마존 EC2 메모리 부족 아파치 자동 재실행 파이썬 스크립트

    아마존 EC2 메모리 부족 아파치 자동 재실행 파이썬 스크립트

    아마존 EC2 운영중 특정 패턴에 대해서 메모리 부족 현상이 자주 발생합니다.

    그 부분을 해결하기 위해 성능향상쪽으로 투자하였습니다.

    하지만 시간만 늘어났을뿐 근본적으로 해결이 되지 않아 파이썬3를 이용하여 자동 실행 스크립트를 만들어보았습니다.

    메모리 사용량이 90%에 도달할 경우 자동으로 아파치 서버를 재실행 해주므로써 전체 메모리를 해제시키는 방법입니다.

    메모리가 100%에 도달하여 스왑파일까지 넘어갈경우 그때부터는 SSH 접속부터 어렵고 시스템이 무척 느려지기때문에 메모리가 90~95% 도달지점에

    아파치 서버를 재실행하는것이 더 효율적으로 보여 데몬으로 5분단위로 메모리를 체크하는 스크립트입니다.

     

    파이썬3가 설치되어져 있으신분들은 아래 명령어를 그대로 복사하여 사용하면됩니다.

     

    #pip 설치
    
    curl https://vlog.tion.co.kr/python/get-pip.py -o get-pip.py 
    
    python3 get-pip.py
    
    
    #pip install psutil 모듈 추가
    
    pip install psutil
    
    #pip list 확인
    
    pip list
    
    
    
    #메모리 체크 스크립트 (각자 상황에 맞춰 limit 부분을 조절합니다. 저는 90%로 맞추었습니다)
    
    mkdir /root/_PYTHON3
    
    vi /root/_PYTHON3/memcheck_httpd_restart.py
    
    import psutil
    import os
    
    mem = psutil.virtual_memory().percent
    limit = 90
    
    print("MEMORY percent is %d%%" % mem)
    print("MEMORY limit is over %d%%" % limit)
    
    if mem > limit:
         os.system("service httpd restart")
    
    
    
    #ESC -> :wq 눌러 저장하고 에디터에서 빠져나옵니다.
    #IndentationError: expected an indented block 에러가 나오면 if문 안쪽 들여쓰기가 안될경우입니다
    
    
    #파이썬 스크립트 동작 확인
    
    python3 /root/_PYTHON3/memcheck_httpd_restart.py
    
    
    
    #크론탭 5분마다 실행 등록
    
    crontab -e
    */5 * * * * python3 /root/_PYTHON3/memcheck_httpd_restart.py

     

     

     

    이 스크립트를 5분마다 실행하여 메모리를 확인하게되면

    메모리가 90%에 도달했을때 아파치 서버를 재실행하게됩니다.

    만약 5분안에 이미 메모리가 100%에 도달하여 시스템 동작이 버벅일경우 재실행이 안될수 있으므로

    각자 상황에 맞춰서 limit % 제한을 조절하셔야합니다.

    데몬은 너무 빠른 시간보다 적당하게 3분~10분정도 조절하면 됩니다.

     

    성능에도 어느정도 투자를 하여야하지만 지금은 하루 1만명정도 이상도 수용이 가능하기때문에 메모리 조절만 잘하면 버틸수 있어보입니다.

    운영해보고 더 좋은 스크립트가 만들어지면 또 공유해드리겠습니다

    파이썬을 몰라도 그냥 그대로 복사 붙여넣기 하면 사용가능할정도로 쉬운 구문이니 복사 붙여넣기 해서 돌려보세요.

  • 파이썬 psutil 설치

    파이썬 psutil 설치

    파이썬 psutil 설치 방법에 대한 문

    우선 파이썬 3 설치 여부를 확인합니다.

    python3 라고 명령어를 입력해보고 설치가 되어져있다면 exit() 눌러 파이썬을 종료합니다.

    파이썬 psutil 설치 방법

    1. pip list 에서 psutil 설치 확인합니다

    파이썬 psutil 설치

    패키지 리스트와 각 모듈의 버전을 확인할 수 있습니다.

    psutil 모듈이 없다면 다음 명령어를 이용하여 설치를 할 수 있습니다.

    2. pip install psutil 명령어를 입력합니다

    파이썬 psutil 설치
    pip install psutil

    psutil 5.8.8 버전이 설치되었음을 확인 할 수 있습니다.

    psutil 모듈을 파이썬에서 호출하여 현재 메모리 전체 용량과 사용하고 남은 용량에 대해서 확인해보는 예제를 만들어보겠습니다.

    python3
    
    import psutil
    psutil.cpu_percent()
    psutil.virtual_memory()
    psutil.virtual_memory().percent
    psutil.virtual_memory().available * 100 / psutil.virtual_memory().total

    파이썬 psutil 모듈 설치와 cpu, 메모리 용량 확인까지 완료해보았습니다.

    이제 psutil  모듈을 이용하여 메모리 용량을 변수값과 비교하여 특정 크기보다 클 경우 웹서버를 재실행하는 스크립트를 만들어볼까요!!

    리눅스 서버가 과부하로 뻗기전에 남은 메모리 이용해서 안정화 시킬수있습니다.

    파이썬 psutil 설치 이전에 pip 부터 인스톨해야합니다.

    파이썬 psutil 이전에 pip

    혹시 아직 pip 인스톨이 안되었다면 아래 포스팅을 보시고 따라 설치하시면됩니다.

  • python pip install 사용법

    python pip install 사용법

    python pip install

    파이선 3 pip 인스톨 방법과 사용법에 대해서 기록합니다.

    우선 python3 버전 확인과 pip 인스톨 방법입니다.

    빠르게 그냥 한번에 복사 붙여넣기로 끝낼려면 아래 명령어를 그대로 복사 붙여넣기 하면됩니다

    curl https://vlog.tion.co.kr/python/get-pip.py -o get-pip.py
    
    python3 get-pip.py
    
    pip list

    python pip install 사용법

    1. python version 확인

    python pip install

    리눅스 콘솔창에서 python 이라고 입력하면 2.7.18 버전이 나타나며 python3 라고 입력하면 3.7.9 버전이 나타납니다.

    오늘 pip 설치는 파이선3 기준으로 진행되므로 파이선2만 설치되셨다면 yum install python3 입력하셔서 설치부터 하여야합니다.

    2. 파이썬 get-pip.py 파일을 다운받습니다.

    아래 명령어를 입력하여 리눅스 서버에 get-pip.py 파일을 저장합니다.

    curl https://vlog.tion.co.kr/python/get-pip.py -o get-pip.py

    3. get-pip.py 파일을 이용하여 인스톨을 시작합니다.

    python pip install
    python3 get-pip.py

    성공적으로 인스톨이 되었다면 pip 명령어를 사용할 수 있습니다.

    다음시간에는 pip를 이용하여 파이썬3 모듈을 하나씩 설치 해보도록 하겠습니다.

    pip list

    명령어를 이용하여 현재 설치되어진 파이썬 모듈을 확인 할 수 있습니다.

  • how to turn on caps lock in c#

    how to turn on caps lock in c#

    how to turn on caps lock in c#

     

    1. Firstly add namespace and DllImport!!

     

    using System.Runtime.InteropServices;
    
    [DllImport("user32.dll")]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

     

    2. Make a function with the code below.

    private void capslock_on_off(string on_off = "on")
    {
    const int KEYEVENTF_EXTENDEDKEY = 0x1;
    const int KEYEVENTF_KEYUP = 0x2;
    
    //on
    if (on_off.ToLower().Equals("on"))
    {
    if (Control.IsKeyLocked(Keys.CapsLock))
    {
    
    }
    else
    {
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
    }
    }
    else
    {
    //off
    if (Control.IsKeyLocked(Keys.CapsLock)) 
    {
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
    }
    }
    
    }

     

    3. How to code using code!!

    Invoke a function by putting lowercase and upper case options into the Enter, TextChanged event each respectively.

     capslock_on_off("off");

     

     

  • how to get current function name in c#

    how to get current function name in c#

    how to get current function name in c#

    1. Use the commands below.

     Console.WriteLine(string.Format("{0}", System.Reflection.MethodBase.GetCurrentMethod().Name));
    System.Reflection.MethodBase.GetCurrentMethod().Name
    You can check it in the console window.
  • c# stackhash bex error cross thread invoke

    c# stackhash bex error cross thread invoke

    c# 언어로 프로그램을 개발하는 도중 문제 이벤트 이름: BEX 라는 명칭으로 에러가 발생하였습니다.

    오류 모듈 이름은 StackHash _ xxxx  이며 이를 구글에 검색해보았지만 익스플로러의 고급 설정인 렌더링을 소프트 방식으로 바꾸라는 방법만 제시하더군요.

     

    인터넷 익스플로러 고급설정에 들어갑니다.

    인터넷 옵션 – 가속 그래픽 – GPU 렌더링 대신 소프트웨어 렌더링 사용*

    이 항목을 클릭하면 해결된다는 MS의 공지가 있었지만 오히려 또 다른 에러를 발생하게 만들더군요.

     

    윈도우 10 메인PC에서는 아무런 에러가 발생하지 않지만 윈도우7 가상화 윈도우에서는 특정 DOCUMENT에 의해서 수시로 반응하여

    에러로 프로그램이 종료되는것을 확인하였습니다.

     

    결국 소스코드 내의 Cross Thread 부분을 수정해주면서 해결되었습니다.

    웹브라우저를 실행하고 그 안에서( 또다른 쓰레드 ) 교차현상이 발생하여 같은 동시간대 같은 쓰레드가 같은 모듈을 이용할때 에러가 난것으로 파악되었습니다.

    이부분에 대한 소스코드를 공개합니다.

     

    TextBox 의 값을 가져올때에는 아래 소스를 이용하면됩니다.

    
    private string getText(TextBox textbox)
    {
    // result value.
    string result = string.Empty;
    
    var getTextValue = new Action(() => result = textbox.Text);
    
    if (textbox.InvokeRequired)
    textbox.Invoke(getTextValue);
    else
    getTextValue();
    
    // return the result.
    return result;
    
    }

    CheckBox의 Checked ( True, False ) 값을 가져올 때에는 아래 소스를 이용하면됩니다.

    private bool Checkbox_checked()
    {
    // result value.
    bool result = false;
    
    // define a function which assigns the checkbox checked state to the result
    var checkCheckBox = new Action(() => result = checkBox_특정문자열.Checked);
    
    // check if it should be invoked. 
    if (checkBox_특정문자열.InvokeRequired)
    checkBox_특정문자열.Invoke(checkCheckBox);
    else
    checkCheckBox();
    
    // return the result.
    return result;
    }
    
    

     

     

  • wordpress smooth scroll without plugin

    wordpress smooth scroll without plugin

     

    우선 Snippets 플러그인은 설치가 되어져있어야합니다.

     

    이 방법은 워드프레스 스크롤 플러그인 없이 스크롤을 부드럽게 특정 위치까지 내리는 방법입니다.

     

    아래 이미지는 소스코드를 그대로 스샷한것이며 실제 소스코드는 이미지 아랫부분에 있으니 복사 붙여넣기 해서 사용하면됩니다.

     

    이 플러그인은 php와 html, css, javascript 등을 어느 페이지에서든 동작하도록 할 수 있습니다.

     

    아래의 소스 코드를 입력하면 지금 보는 이 화면처럼 동작합니다.

     

    add_shortcode( '자동스크롤', function ($attr, $value) {
    
    $height = 0;
    $millisecond = 0;
    
    if (strpos($value, ',') !== false)
    {
    $arrayHeightMillisecond = explode(',', $value);
    $height = $arrayHeightMillisecond[0];
    $millisecond = $arrayHeightMillisecond[1];
    }
    
    $out = '<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script>
    
    $(document).ready(function(){
    $("html, body").animate({ scrollTop: '.$height.' }, '.$millisecond.');
    });
    </script> 
    ';
    
    return $out;
    } );

     

    사용방법

    글, 포스트 페이지 상단 또는 하단부분에 아래처럼 입력합니다

    앞의 500숫자는 height 높이이며 두번째 500숫자는 애니메이션 시간입니다.

    argument 1: height

    argument 2: millisecond

    ex) 500, 500 => 500px, 0.5 sec

     

    [자동스크롤]150,500[/자동스크롤]

     

  • AWS AUTO BACKUP

    AWS AUTO BACKUP

    AWS AUTO BACKUP SYSTEM

    아마존 AWS EC2 서버를 다수 운영하다보면 일괄적으로 백업을 해야하는 경우가 존재합니다.

    아마존 AWS 에서는 스냅샷을 이용하여 원하는 시점을 백업하고 이미지 AMI(아마존 이미지)로 보관 할 수 있습니다.

    이 방법을 통해서 기존서버에서 AWS 서버로 1분도 안되어서 서버 이전을 할 수 있게되었습니다.

    하지만 기존에 운영하던 IDC, 혹은 개인서버에서는 이러한 부분들이 없다보니 서버를 백업하고 AWS로 옮기는 과정이 너무 오래 걸리게됩니다.

    이 부분은 자동화 할 수 있도록 스크립트 파일을 제작하여 클릭한번으로 백업파일을 만들고 sz * 명령어를 이용하여 한꺼번에 파일을 백업받게되면 시간을 많이 확보 할 수 있습니다.

    cd /root/BACKUP_SERVER
    
    sz *

     

     

    string BACKUP_FORDER_NAME = "BACKUP_SERVER";
    
    client.RunCommand(string.Format("/usr/bin/rm -rf /root/{0}", BACKUP_FORDER_NAME));
    client.RunCommand(string.Format("/usr/bin/mkdir /root/{0}", BACKUP_FORDER_NAME));
    client.RunCommand(string.Format("/usr/bin/cd /root/{0}", BACKUP_FORDER_NAME));
    
    
    //ssl certification file
    if (e.Argument.ToString().Contains("https"))
    {
    client.RunCommand(string.Format("/usr/bin/tar cvf /root/{0}/ssl_{1}.tar /etc/ssl/certs/{1}", BACKUP_FORDER_NAME, textBox_사이트생성_도메인.Text));
    
    }
    
    //httpd vhost conf
    client.RunCommand(string.Format("/usr/bin/cp -rfv /etc/httpd/conf.d/httpd-vhosts-{1}.conf /root/{0}", BACKUP_FORDER_NAME, textBox_사이트생성_도메인.Text));
    
    //httpd web files
    client.RunCommand(string.Format("/bin/mysqldump -uMariadbUser -pMariadbPassword {1} > /root/{0}/sql_{2}.sql", BACKUP_FORDER_NAME, textBox_사이트생성_도메인.Text.Replace(".", ""), textBox_사이트생성_도메인.Text));
    
    //mariadb database backup
    client.RunCommand(string.Format("/usr/bin/tar cvf /root/{0}/{1}.tar /var/www/html/{2}", BACKUP_FORDER_NAME, textBox_사이트생성_도메인.Text, textBox_사이트생성_폴더명.Text));
    
    
    MessageBox.Show(string.Format("서버백업완료\r\n\r\n/root/{0} 폴더의 파일을 PC로 복사하면됩니다.", BACKUP_FORDER_NAME));

     

    서버백업 클릭 한번과 SSH 접속 후 sz * 명령어 한번으로 서버 전체를 다운받아 AWS로 쉽게 옮길수 있습니다.

     

  • crontab 으로 리눅스 시간 동기화 rdate -s time.bora.net

    crontab 으로 리눅스 시간 동기화 rdate -s time.bora.net

    crontab 명령어를 이용하여 주기적으로 리눅스 시간을 동기화 할 수 있습니다.

    하루에 1번만 하더라도 큰 오차는 생기지 않지만 제가 운영하는 서버 특성상 30분마다 확인합니다.

    /root 폴더의 autoLogsDelete.sh 파일은 httpd 로그가 많이 쌓여서 자동으로 삭제 되도록 하였습니다.

    스크립트는 아랫부분을 확인해보세요

     

    서울 시간으로 일단 맞춥니다.

    timedatectl set-timezone Asia/Seoul

     

    Crontab 내부에 로컬타임을 매일 00시 00분 마다 지정하여도 됩니다.

     

    crontab -e
    
    00 03 * * * /root/autoLogsDelete.sh
    00 09 * * * /root/autoLogsDelete.sh
    00 15 * * * /root/autoLogsDelete.sh
    00 21 * * * /root/autoLogsDelete.sh
    00 00 * * * ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
    00 00 * * * rdate -s time.bora.net
    30 00 * * * rdate -s time.bora.net
    00 01 * * * rdate -s time.bora.net
    30 01 * * * rdate -s time.bora.net
    00 02 * * * rdate -s time.bora.net
    30 02 * * * rdate -s time.bora.net
    00 03 * * * rdate -s time.bora.net
    30 03 * * * rdate -s time.bora.net
    00 04 * * * rdate -s time.bora.net
    30 04 * * * rdate -s time.bora.net
    00 05 * * * rdate -s time.bora.net
    30 05 * * * rdate -s time.bora.net
    00 06 * * * rdate -s time.bora.net
    30 06 * * * rdate -s time.bora.net
    00 07 * * * rdate -s time.bora.net
    30 07 * * * rdate -s time.bora.net
    00 08 * * * rdate -s time.bora.net
    30 08 * * * rdate -s time.bora.net
    00 09 * * * rdate -s time.bora.net
    30 09 * * * rdate -s time.bora.net
    00 10 * * * rdate -s time.bora.net
    30 10 * * * rdate -s time.bora.net
    00 11 * * * rdate -s time.bora.net
    30 11 * * * rdate -s time.bora.net
    00 12 * * * rdate -s time.bora.net
    30 12 * * * rdate -s time.bora.net
    00 13 * * * rdate -s time.bora.net
    30 13 * * * rdate -s time.bora.net
    00 14 * * * rdate -s time.bora.net
    30 14 * * * rdate -s time.bora.net
    00 15 * * * rdate -s time.bora.net
    30 15 * * * rdate -s time.bora.net
    00 16 * * * rdate -s time.bora.net
    30 16 * * * rdate -s time.bora.net
    00 17 * * * rdate -s time.bora.net
    30 17 * * * rdate -s time.bora.net
    00 18 * * * rdate -s time.bora.net
    30 18 * * * rdate -s time.bora.net
    00 19 * * * rdate -s time.bora.net
    30 19 * * * rdate -s time.bora.net
    00 20 * * * rdate -s time.bora.net
    30 20 * * * rdate -s time.bora.net
    00 21 * * * rdate -s time.bora.net
    30 21 * * * rdate -s time.bora.net

    /root/autoLogsDelete.sh

    find /etc/httpd/logs/ -size +100M -exec rm -rf {} \;
    service httpd restart
    
    chmod 701 /root/autoLogsDelete.sh