From fb4b066deb09dc0f4a1ca1a64d7545328b748502 Mon Sep 17 00:00:00 2001 From: ButterYoon Date: Wed, 8 Nov 2023 01:59:25 +0900 Subject: [PATCH] bash script --- _posts/2023-10-29-bash.md | 100 ++++++++++++++++++++++++++++++++++ assets/img/command-title.webp | Bin 0 -> 22662 bytes 2 files changed, 100 insertions(+) create mode 100644 _posts/2023-10-29-bash.md create mode 100644 assets/img/command-title.webp diff --git a/_posts/2023-10-29-bash.md b/_posts/2023-10-29-bash.md new file mode 100644 index 0000000..a6f99fd --- /dev/null +++ b/_posts/2023-10-29-bash.md @@ -0,0 +1,100 @@ +--- +layout: post +comments: true +title: "BASH 스크립트로 서비스 부하 테스트 하기" +description: "서비스 API 성능 테스트를 위해 쉘 스크립트를 만들어본다." +img: command-title.webp +date: 2023-10-29 11:00:00 +0900 +last_modified_at: 2023-10-29 11:00:00 +0900 +tags: [command-line, bash, script, load test] # add tag +related: command-line +categories: tools +--- + +성능 테스트를 위해 몇 가지 툴들을 알아보다 제품의 특성에 맞게 구현하기 위해 쉘 스크립트로 구현하려고 한다. + +오랜만에 쉘 스크립트를 만지려니 이건 뭐 완행열차가 따로 없다. + +단순한 반복문이나 문자열 처리부터 chatGPT에게 물어보면서 하려니 영 속도가 나지 않는다. + +뭐! 삽질 한두번 해본것도 아니고!! 또 해본다. + + + +## 순차적으로 증가하는 일련번호 만들기. + +기준이 되는 데이터가 필요한데 순차적으로 증가하는 일련번호가 필요하다. + +엑셀로 만들어도 되겠지만 터미널에서 **vim**으로 선택된 영역의 숫자를 순차적으로 증가시킬 수 있다. + +> vim의 명령어 모드에서 +> **Ctrl-v** 로 원하는 영역에 "Visual Block"을 설정하고. +> **g Ctrl-a** 하면 아래와 같이 D0002 ~ D0011 과 같은 순서대로 증가하는 일변번호를 만들 수 있다. + +```text +$ cat application.lst + +D0002, 7000002, I, A, 1528100002 +D0003, 7000003, I, A, 1528100003 +D0004, 7000004, I, A, 1528100004 +D0005, 7000005, I, A, 1528100005 +D0006, 7000006, I, A, 1528100006 +D0007, 7000007, I, A, 1528100007 +D0008, 7000008, I, A, 1528100008 +D0009, 7000009, I, A, 1528100009 +D0010, 7000010, I, A, 1528100010 +D0011, 7000011, I, A, 1528100011 +``` + +## 콤마(,)로 구분된 텍스트 파일 읽어 loop + +아래와 같이 while loop 의 IFS(필드 분리자)를 콤마(,)로 설정하고 읽어 올 변수를 설정하면 FILE의 라인 수만 큼 loop가 반복된다. + +```bash +FILE='application.lst' + +# main loop +echo "START : "`date +%T.%3N` +while IFS=',' read col1 col2 col3 col4 col5 +do +# action +echo "docid=$col1 appid=$col2 inout=$col3 type=$col4 cid=$col5" +sleep 0.01 +done < $FILE +echo "END : "`date +%T.%3N` + + +START : 01:44:54.887 +docid=D0002 appid= 7000002 inout= I type= A cid= 1528100002 +docid=D0003 appid= 7000003 inout= I type= A cid= 1528100003 +docid=D0004 appid= 7000004 inout= I type= A cid= 1528100004 +docid=D0005 appid= 7000005 inout= I type= A cid= 1528100005 +docid=D0006 appid= 7000006 inout= I type= A cid= 1528100006 +docid=D0007 appid= 7000007 inout= I type= A cid= 1528100007 +docid=D0008 appid= 7000008 inout= I type= A cid= 1528100008 +docid=D0009 appid= 7000009 inout= I type= A cid= 1528100009 +docid=D0010 appid= 7000010 inout= I type= A cid= 1528100010 +docid=D0011 appid= 7000011 inout= I type= A cid= 1528100011 +END : 01:44:55.006 +``` + +## bash 시간 포맷 + +아래와 같이 date 명령어로 시간 포맷을 정할 수 있다. + +> %T : %H:%M:%S 형식으로 시:분:초를 표시한다. +> %N : nanoseconds 단위를 표시한다. +> %3N : 소수점 이하 3자리 까지 표시 + +```bash +❯ date +%T.%N +01:55:26.893696184 + +❯ date +%T.%3N +01:57:52.356 +``` + + +## 참고 URL +- [고급 Bash 스크립팅 가이드](https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/) +- [bash - LinuxOPsys](https://linuxopsys.com/?s=bash) diff --git a/assets/img/command-title.webp b/assets/img/command-title.webp new file mode 100644 index 0000000000000000000000000000000000000000..3a621cc1e1993065018b85fbc5a43e7f12985289 GIT binary patch literal 22662 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 literal 0 HcmV?d00001