[Linux] mysql 복구 script

mysql이 자꾸 죽으면서 워드프레스가 DB연결을 못하고 자꾸 에러를 띄운다.

InnoDB memory pool size가 기본으로 128M로 되어 있는데, 이걸 할당을 못하고 죽는 것 같다.

64M로 줄이자.

# vi /etc/mysql/conf.d/innodb.cnf
[mysqld]
innodb_buffer_pool_size = 64M

 

죽으면 사실 그냥 service mysql restart 해주면 되는데, 요거도 귀찮으니까 돌려서 죽으면 실행하게 스크립트를 만들자

# vi mysqlmon.sh
#!/bin/bash

linecount=`ps -aux | grep /usr/sbin/mysqld | wc -l`

if [ "$linecount" = "2" ]; then
        echo "`date`: Working well" >> /var/log/mysqlmon/mysqlmon.log;
else
        echo "`date`: Trying to recover..." >> /var/log/mysqlmon/mysqlmon.err;
        service mysql restart;
        echo "`date`: Done" >> //var/log/mysqlmon/mysqlmon.err;
fi

 

crontab에 등록하자

# crontab -e
*/5 * * * * /root/mysqlmon.sh

 

log파일을 관리하도록 [Linux] logrotate 설정 글의 예제처럼 logrotate를 설정하자.

[Python] BeautifulSoup/requests 모듈, shell script로 네이버 금시세 기록하기

금 시세 기록을 위해 만든 python 스크립트

1. BeautifulSoup을 설치하자.

$ sudo apt-get install python-bs4

2. 네이버 금시세를 얻어와서 출력하자. Text file로 만들거니까..

# gold.py
import requests
from bs4 import BeautifulSoup
page = 1
while (1):
        reqstr = 'http://info.finance.naver.com/marketindex/goldDailyQuote.nhn?page=' + str(page)
        req = requests.get(reqstr)
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')
        my_date = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(1)'
                )
        my_values = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(2)'
                )
        if (len(my_values) <= 0):
                break
        row = 0
        for title in my_values:
                print(my_date[row].text + '\t' + title.text)
                row = row + 1
        page = page + 1

3. 매일 실행시키려면, crontab 등록을 위해 shell script를 하나 만들자

#/bin/sh

python /home/dasomoli/src/gold.py > /mnt/NAS/Data/Gold/`date +%F`.txt

4. crontab에 등록하자

$ crontab -e

0 1 * * * /home/dasomoli/src/record_gold.sh

 

DB만들어서 기록하면, 한번 요청으로 끝나겠지만 귀찮고, 육아로 시간이 없으므로 오늘은 여기까지!

[Android] adb & fastboot 관련 명령 정리

자주 쓰는 명령 몇 개만 정리하자.

adb shell [명령] : shell 또는 명령 실행(‘cat /proc/kmsg’ 라던가..)
adb reboot :  reboot
adb reboot [bootloader | recovery] : reboot & [fastboot | recovery]모드 들어가기
adb logcat [TAG:LEVEL] [*:S] : logcat, 특정 TAG를 LEVEL(S,V,I,D,…)로 보기, *:S 넣으면 나머지는 Silent.
adb root : root 로 adbd 재실행
adb remount : system 파티션을 rw로 remount
adb push, pull : 파일 넣기, 빼오기, read/write 시스템 콜 이용으로도 사용 가능.
adb wait-for-devices [명령] : adb 연결 기다렸다 명령 실행
adb devices : 붙었나?
adb sideload <파일이름.zip> : OTA패키지인 파일이름.zip 을 adb 를 통해 업데이트. JB부터 추가

fastboot flash <파티션 이름> <파일명> : 파티션 이름에는 bootloader, boot, zimage, ramdisk, system, userdata, cache, recovery 등이 올 수 있다.
fastboot wait-for-devices : 윈도우즈는 그냥 명령 주면 대기하므로 필요없다. 리눅스용에서 사용.
fastboot [-w] flashall : 윈도우즈에서는 “set ANDROID_PRODUCT_OUT=D:\out\target\product\crespo” 해두고 하면 된다. -w 옵션주면 userdata 등 파티션 날리고 모두 flash
fastboot [-w] update <zip 파일이름> : update용 zip 파일(make updatepackage로 생성)로 업데이트, 역시 -w 옵션 주면 나머지 날림.
fastboot reboot-bootloader : fastboot 모드로 reboot
fastboot reboot : reboot.
fastboot getvar <Variable> : Variable 을 얻어옴. 전체는 all(“fastboot getvar all”)
fastboot devices : 붙었나?
 

[Linux] Shell script 에서 문자열 다루기

참고에 매우 자세히 잘 정리되어 있다. 감사.

문자열 길이 구하기
${#string}

문자열 추출
${string:position}
${string:position:length}

문자열 조각 삭제
${string#substring}
 string의 앞에서부터 가장 짧게 일치하는 substring 제거
${string##substring}
 string의 앞에서부터 가장 길게 일치하는 substring 제거

${string%substring}
 string의 뒤에서부터 가장 짧게 일치하는 substring 제거
${string%%substring}
 string의 뒤에서부터 가장 길게 일치하는 substring 제거

참고 : 
http://wonylog.tistory.com/192

[Linux] shell 에서 메일 보내기

이용 가능한 SMTP가 있는 경우 shell 에서도 메일을 보낼 수 있다. 쉘 스크립트 상에서 메일을 보내거나 할 때 유용하다. 가장 편한 방법이 sendemail 을 이용하는 것 같다.
다음과 같이 하면 된다. 아래 예제는 무인증 SMTP를 이용할 경우의 예제이다.

$ sendEmail -f “보내는이@메일” -s <SMTP 서버 주소> -t “받는이@메일” -u “메일 제목” -m “메일 내용”

Perl script 를 이용해서도 간편히 보낼 수 있는데, 예제는 다음과 같다.

#!/usr/bin/perl -w
use Net::SMTP;
$smtp = Net::SMTP->new(‘<SMTP 서버 주소>’);
$smtp->mail(‘보내는이@메일’);
$smtp->to(‘받는이@메일’);
$smtp->data();
$smtp->datasend(“To: dasomoli\n”);
$smtp->datasend(“Subject: A simple test mail subject\n”);
$smtp->datasend(“\n”);
$smtp->datasend(“A simple test message\n”);
$smtp->datasend(“A simple test message 2\n”);
$smtp->dataend();
$smtp->quit;

한글 메일을 보내고 싶으면 perl 스크립트로 아래와 같이 MIME::Lite 를 사용하면 된다.

$ sudo apt-get install libmime-lite-perl

#!/usr/bin/perl -w
use MIME::Lite;
### Create a new multipart message:
$msg = MIME::Lite->new(
                From    => ‘보내는이@메일’,
                To      => ‘받는이@메일’,
                Subject => ‘Hangul test’,
                Data    => ‘한글’,
                );
$msg->attr(‘content-type.charset’ => ‘UTF-8’);
### Add parts (each “attach” has same arguments as “new”):
### use Net:SMTP to do the sending
$msg->send(‘smtp’, ‘<SMTP 서버 주소>’, Debug=>1 );

참고 : 
http://nixcraft.com/shell-scripting/11895-shell-script-send-email-via-smtp-username-password.html
http://caspian.dotconf.net/menu/Software/SendEmail/
http://perldoc.perl.org/Net/SMTP.html
http://search.cpan.org/~rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm

Shell script 에서 자주 쓰는 명령들

처음 시작은
#!/bin/sh

Perl 처음 시작은
#!/usr/bin/perl -w

argument는 $0 $1 $2 …
argument 처리는 아래 형식.

for ARGUMENT in “$@”; do
case $ARGUMENT in
–commit)
COMMIT=$2;
;;
–uploader)
UPLOADER=$2;
;;
–branch)
BRANCH=$2;
;;
–patchset)
PATCHSET_ID=$2;
;;
–change-url)
CHANGE_URL=$2;
CHANGE_NO=`basename $CHANGE_URL`;
;;
esac
shift;
done

Perl에서 Argument 처리는
$ARGV[0], $ARGV[1], $ARGV[2]… $#ARGV 는 argument 개수
 

공백으로 나눠진 파라미터 프린트
gawk ‘{print $1}’

/로 나눠진 마지막 파라미터 프린트. cut 도 사용가능
gawk -F / ‘{print $NF}’

파일명 얻기는
basename 경로명

디렉토리명 얻기는
dirname 경로명

절대경로 얻을 때는
readlink -e 상대경로

특정 문자열 치환은
sed -e “s/문자열/문자열/g”

if는 이런 형식. 비교식은 http://www.gnu.org/s/bash/manual/bash.html#Bash-Conditional-Expressions 참고

if [ “$변수” = “” ]; then
  명령;

elif
  명령;
else
  명령;
fi

for each 는 이런 형식

for 변수 in $가져올변수
do
  echo “$변수”
done

case는 위의 argument 처리 참고.

명령의 결과 저장은 `명령`
변수의 값으로 치환한 문자열은 “$변수 포함 문자열”
그냥 그대로 문자열은 ‘문자열’

끝에만 자를 땐
tail -n 숫자

앞에만 자를 땐
head -n 숫자

문자열 있는 줄만 얻고 싶을 땐
grep “문자열”

정규식으로 찾은 문자열 포함된 줄만 얻고 싶을 땐
grep -P “^문자열[0-9a-zA-Z-_/]*$”

basic http 인증은 https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients 참고

html 얻어올 때는
curl “주소”

Windows Shell Extension 개발 참고자료

MSDN : Creating Shell Extension Handlers

The Complete Idiot’s Guide to Writing Shell Extensions
 Part 1
 Part 2
 Part 3
 Part 4
 Part 5
 Part 6
 Part 7
 Part 8
 Part 9

Shell Extension Context Menu Sample
Registry에 등록하는 건 Post-Build Step 에서 Regsvr32를 이용해서 등록한다. 커맨드는 다음과 같다.

regsvr32.exe /s /c $(OUTDIR)\CtxMenu.dll

Registry에 등록을 해제하는 건 다음과 같은 커맨드로 가능하다.

regsvr32.exe /s /u $(OUTDIR)\CtxMenu.dll

Registry 등록 관련 절차는 ShellExtReg.cpp 내의 RegisterFileMenu() 와 UnregisterFileMenu() 내부를 참고하면 좋다.