'Developer > DNN' 카테고리의 다른 글
Visual Studio Code 설치 (ubuntu) (0) | 2019.10.06 |
---|---|
Anaconda 환경 관리 (0) | 2019.10.05 |
Visual Studio Code 설치 (ubuntu) (0) | 2019.10.06 |
---|---|
Anaconda 환경 관리 (0) | 2019.10.05 |
윈도우에서 Ubuntu Bootable USB 만들기 (0) | 2019.06.30 |
---|---|
쉘 스크립트 작성(4) (0) | 2019.06.18 |
쉘 스크립트 작성(3) (0) | 2019.06.16 |
쉘 스크립트 작성(2) (0) | 2019.06.16 |
쉘 스크립트 작성 (0) | 2019.06.16 |
! |
논리 부정 |
~ |
비트 부정 |
** |
지수화 |
<< |
비트 왼쪽 쉬프트 |
>> |
비트 오른쪽 쉬프트 |
& |
비트 단위 AND |
| |
비트 단위 OR |
&& |
논리 AND |
|| |
논리 OR |
num++ |
후위증가 |
num-- |
후위감소 |
++num |
전위증가 |
--num |
전위감소 |
윈도우에서 Ubuntu Bootable USB 만들기 (0) | 2019.06.30 |
---|---|
쉘 스크립트 작성(5) (0) | 2019.06.18 |
쉘 스크립트 작성(3) (0) | 2019.06.16 |
쉘 스크립트 작성(2) (0) | 2019.06.16 |
쉘 스크립트 작성 (0) | 2019.06.16 |
비교식 |
기능 |
num1 -eq num2 |
num1 과 num2가 같은지 확인한다. |
num1 -ne num2 |
num1 과 num2가 다른지 확인한다. |
num1 -ge num2 |
num1이 num2 보다 크거나 같은지 확인한다. |
num1 -gt num2 |
num1이 num2보다 큰지 확인한다. |
num1 -le num2 |
num1이 num2보다 작거나 같은지 확인한다. |
num1 -lt num2 |
num1이 num2보다 작은지 확인한다. |
비교식 |
기능 |
str1 = str2 |
str1이 str2와 같은지 확인한다. |
str1 != str2 |
str1이 str2와 다른지 확인한다. |
str1 < str2 |
str1이 str2보다 작은지 확인한다. |
str1 > str2 |
str1이 str2보다 큰지 확인한다. |
-n str |
str의 길이가 0보다 큰지 확인한다. |
-z str |
str의 길이가 0인지 확인한다. |
비교식 |
기능 |
-d file |
파일이 존재하며, 파일의 종류가 디렉토리인가? |
-e file |
파일이 존재하는가? (파일 종류는 상관X) |
-f file |
파일이 존재하고 정규 파일(Regular file)인가? |
-r file |
파일이 존재하며, 읽을 수 있는가? |
-s file |
파일이 존재하며, 비어 있지 않은가? |
-w file |
파일이 존재하며, 기록할 수 있는가? |
-x file |
파일이 존재하며, 실행할 수 있는가? |
-O file |
파일이 존재하며, 현재 사용자가 소유했는가? |
-G file |
파일이 존재하며, 기본 그룹이 현재 사용자와 같은가? |
file_1 -nt file_2 |
file_1이 file_2보다 새것인가? |
file_1 -ot file_2 |
file_1이 file_2보다 오래되었나? |
쉘 스크립트 작성(5) (0) | 2019.06.18 |
---|---|
쉘 스크립트 작성(4) (0) | 2019.06.18 |
쉘 스크립트 작성(2) (0) | 2019.06.16 |
쉘 스크립트 작성 (0) | 2019.06.16 |
쉘 스크립트 파일 만들기 (0) | 2019.06.09 |
쉘 스크립트 작성(4) (0) | 2019.06.18 |
---|---|
쉘 스크립트 작성(3) (0) | 2019.06.16 |
쉘 스크립트 작성 (0) | 2019.06.16 |
쉘 스크립트 파일 만들기 (0) | 2019.06.09 |
변수 배열 (0) | 2019.06.09 |
쉘 스크립트 작성(3) (0) | 2019.06.16 |
---|---|
쉘 스크립트 작성(2) (0) | 2019.06.16 |
쉘 스크립트 파일 만들기 (0) | 2019.06.09 |
변수 배열 (0) | 2019.06.09 |
PATH 환경 변수 (0) | 2019.06.09 |
쉘 스크립트 작성(2) (0) | 2019.06.16 |
---|---|
쉘 스크립트 작성 (0) | 2019.06.16 |
변수 배열 (0) | 2019.06.09 |
PATH 환경 변수 (0) | 2019.06.09 |
사용자 정의 변수 선언 (0) | 2019.06.07 |
쉘 스크립트 작성 (0) | 2019.06.16 |
---|---|
쉘 스크립트 파일 만들기 (0) | 2019.06.09 |
PATH 환경 변수 (0) | 2019.06.09 |
사용자 정의 변수 선언 (0) | 2019.06.07 |
환경 변수 (0) | 2019.06.07 |
쉘 스크립트 파일 만들기 (0) | 2019.06.09 |
---|---|
변수 배열 (0) | 2019.06.09 |
사용자 정의 변수 선언 (0) | 2019.06.07 |
환경 변수 (0) | 2019.06.07 |
코프로세싱 (0) | 2019.06.06 |
PATH 환경 변수 (0) | 2019.06.09 |
---|---|
사용자 정의 변수 선언 (0) | 2019.06.07 |
코프로세싱 (0) | 2019.06.06 |
백그라운드 (0) | 2019.06.06 |
서브 쉘(2) (0) | 2019.06.06 |
코프로세싱(Co-processing)은 두 가지 작업을 동시에 수행하는 것을 뜻하며,
백그라운드에서 서브 쉘을 생성하고 서브 쉘에서 명령을 실행한다.
coproc {서브쉘에서 실행할 명령}
coproc 두번 실행했더니 Warning이 떴는데, 실행은 된다.
서브 쉘에서 명령을 실행한다고 해서 ps --forest 로 확인을 해봤더니 서브 쉘에서 실행하지 않고 있는데,
어떻게 된 것일까?
내가 서브 쉘을 생성해주어야 서브 쉘에서 실행을 하는 걸까?
coproc 명령을 백그라운드로 보내도 차이가 없다.
백그라운드에 명령을 실행하면 명령이 처리되는 동안에도 자유롭게 터미널을 다른 일에 쓸 수 있다.
백그라운드에서 명령이 실행되도록 하려면 마지막에 & 문자를 붙인다.
백그라운드에 명령을 실행하면 프로세스에 대한 정보를 제공하는데,
대괄호 안의 숫자에 백그라운드 프로세스 번호를 알려주고
그 프로세스의 ID (PID)를 알려준다.
백그라운드에서 명령을 실행시킨 후 jobs 명령을 사용하면 현재 백그라운드에서 실행되고 있는
프로세스 목록을 출력하는데, 백그라운드 프로세스 번호, 상태 그리고 명령을 출력한다.
프로세스가 동작 중일때에는 Running이라고 나타나며, 프로세스가 끝나면 Done이라고 표시한다.
jobs 명령에 -l 옵션을 추가하면 PID가 추가로 출력된다.
쉘 안에서 많은 양의 작업들을 수행해야 할 경우에 백그라운드로 명령을 실행하면 터미널을 계속 사용할 수 있기 때문에
좀 더 터미널의 사용에 유연해질 수 있다.
터미널을 여러개 띄우는 것보다 백그라운드에서 작업을 하는게 나 개인적으로는 편했다.
한 줄에 일련의 명령들을 입력하여 순차적으로 실행하는 방법이 있다.
각 명령들 사이에 세미콜론(;)을 넣어주면 연속적으로 명령들을 실행할 수 있다.
이러한 방식은 명령을 실행하기 위해서 서브 쉘을 생성하지 않는다.
그 근거는 BASH_SUBSHELL 변수의 값이 0이라는 것에서 알 수 있다.
괄호를 사용해서 명령을 그룹화하는 방법이 있다고 한다.
이러한 방식은 명령을 실행하기 위해서 서브 쉘을 생성한다.
그룹화된 명령 안에 또 다른 그룹화된 명령이 들어갈 수도 있다.
그리고 괄호 쌍의 갯수만큼 서브 쉘을 생성한다.
서브 쉘을 쓰고 안 쓰고가 큰 차이가 있는지 잘 모르겠다.
그 이유를 좀 더 알아볼 필요가 있어보인다.
쉘 이름을 터미널에 입력하면 서브 쉘이 생성된다.
첫번째 쉘(PID 1775)에서 파생된 두 번째 쉘(PID 2100)의 PPID가 첫 번째 쉘의 PID와 일치하는 것으로 보아
두 번째 쉘은 첫 번째 쉘에서 파생된 서브 쉘이라는 것을 알 수 있다.
세 번째 쉘의 PPID는 2100이며, 이는 두 번째 쉘의 PID와 일치한다.
네 번째 쉘의 PPID는 2109이며, 이는 세 번째 쉘의 PID와 일치한다.
ps --forest 명령은 서브 쉘들이 어떻게 가지를 쳤는지 보여준다.
exit 명령을 통해 서브 쉘에서 빠져나갈 수 있다.
참고로 쉘 스크립트를 실행하면 서브 쉘이 생성된다.
이름 그 자체를 생각해보았을 때 무엇인가를 외부 요인으로부터 보호하기 위해 둘러싼 껍질이라는 게 떠올랐다.
껍질이 있으면 알맹이를 보는 게 어렵다.
그리고... 껍질은 외부와 알맹이 사이에 존재한다.
이것을 리눅스 커널과 사용자의 개념에 적용해본다면
쉘은 사용자(외부)로부터 커널(알맹이)를 보호하는 역할을 함과 동시에 둘 사이에 존재해서 상호작용을 할 수 있도록
만들어 주는 역할, 즉 사용자가 명령을 하면 그것을 커널에게 전달해주는 역할을 하는 것이 아닐까?
나는 어떤 쉘을 쓰고 있는걸까?
/etc/passwd 파일에는 모든 사용자 계정 목록과 각 계정의 기본 쉘들이 지정되어 있다.
내가 쓰는 쉘을 알고 싶기 때문에
cat /etc/passwd | grep jseok
bash로 나의 기본 쉘이 지정되어 있는 것을 확인할 수 있다.
chsh 명령을 통해 bash를 csh로 기본 쉘을 바꾸어 보자.
Restart 후에 현재 쉘을 확인하면 /bin/csh로 바뀌었다.
파이프는 | 로 나타내며, 앞에서 실행된 명령의 결과를 뒤쪽의 명령어로 전달하라는 의미이다.
그래서 파이프를 사용하면 뒤쪽의 명령어는 앞쪽의 명령어의 결과를 바탕으로
또 다른 결과가 나오게 할 수 있다.
즉, 각각의 명령어들의 기능을 조합하여 새로운 명령 또는 복잡한 명령을 수행할 수 있게 만들어 준다.
ps u | grep make
cat compile.log | more
tail -n 20 compile.log | grep Error
리다이렉트(redirect)는 > 또는 < 기호로 나타내며, 표준 입출력의 방향을 바꿔주고 싶을 때 사용한다.
ls > list.txt
ls 명령어는 결과를 콘솔 화면(표준 출력)에 출력하는데, 이를 화면이 아닌 list.txt 파일에 저장하라는 뜻.
tail -n 20 compile.log > result.txt
compile.log의 제일 끝 부분의 20줄만 콘솔 화면에 출력하는데, 이를 화면이 아닌 result.txt 파일에 저장하라는 뜻
grep hello < hello_world.c
hello_world.c 파일을 읽어서 hello라는 단어가 있는 줄만 화면에 출력.
cat hello_world.c | grep hello 와 같은 결과를 출력.
링크 파일은 윈도우 OS에서의 바로가기 파일이라고 보면 된다.
나는 보통 여러 번의 디렉토리를 통하지 않고 한 번에 원하는 파일에 접근하고 싶을 때 사용한다.
프로젝트 디렉토리에서 내가 필요한 파일들을 링크 걸어 내가 원하는 파일에 빠르게 접근한다.
스크립팅을 할 때에도 요긴하게 쓰인다.
뭐... 아무튼 바로가기를 만들어 본 사람이라면 왜 링크 파일을 쓰는 지 잘 알 것이라고 본다.
ln -s src dst
여기서 -s 옵션은 심볼릭 링크를 생성하라는 뜻이다.
링크 파일은 두가지 형식이 존재한다.
심볼릭 링크(Symbolic link)는 원본 파일을 가리키는 정보만을 가지고 있다.
그래서 원본 파일이 삭제되면 심볼릭 링크 파일은 의미가 없어진다.
하드 링크(Hard link)는 원본 파일의 내용을 공유한다. 따라서 원본 파일을 삭제하더라도
링크 파일은 그대로 남아있게 되며, 원본 파일이나 링크 파일이 수정되면 두 파일의 내용이 모두 수정된다.
반대로, 하드 링크를 지우더라도 원본 파일은 그대로 남아있다.
여러가지 파일을 묶어서 전달하고 싶을 때 압축을 한다.
또는 큰 용량을 압축하여 줄이고 싶을 때에도 압축을 한다.
입축 형식은 크게 두가지이다.
tar.gz과 zip.
zip은 윈도우 OS를 많이 사용하기 때문에 익숙하겠지만 tar.gz은 익숙하지 않았다.
물론 나 역시도 리눅스 어린이이기 때문에 이 확장자가 뭔지... 처음보는 형식이라 많이 당황했다.
익숙한 zip 파일의 경우 파일을 압축하기 위해서는 다음과 같이 입력하면 된다.
zip myfiles.zip list1.txt list2.txt
압축을 풀 때에는
unzip myfiles.zip
tar.gz 파일은 리눅스 OS에서 자주 사용되는 압축 형식이다.
tar.gz은 두가지 형식이 중첩된 구조다.
tar 형식은 압축하지 않고 모든 파일을 모아서 하나의 파일로 만드는 구조이며,
gz은 묶인 하나의 파일을 압축하는 구조이다.
압축을 할 경우
tar -czvf cmu.tar.gz ~/work/cmu/*
~/work/cmu/ 에 있는 모든 파일들을 cmu.tar.gz으로 압축
압축을 풀 경우
tar -xzvf cmu.tar.gz
압축할 때 용량을 압축하지 않고 파일만 묶고 싶은 경우에는 gz 형식을 쓰지 않아도 된다.
tar -cvf cmu.tar.gz ~/work/cmu/*
.tar 형식을 압축 풀 경우
tar -xvf cmu.tar.gz
파이프 그리고 리다이렉트 (0) | 2019.06.01 |
---|---|
링크 파일 (0) | 2019.05.31 |
용량 체크 (0) | 2019.05.31 |
프로세스 관리 (0) | 2019.05.31 |
리눅스 파일 및 내부 문자열 찾기 (0) | 2019.05.30 |
EDA 툴을 돌리다보면 시뮬레이션 파일의 용량이 상당히 커지고, 각종 db 파일들의 용량이 몇백 GB일때도 있다.
그러다보면 디스크의 용량을 체크할 수 밖에 없다.
저장 장치의 목록과 사용량을 확인해보려면 df 명령을 사용한다.
df -h 명령을 입력하면 되는데 여기서 -h는 사람이 보기 편하게 단위를 보여주는 옵션이다.
그리고 저장 장치의 전체 용량을 확인하고 싶은 것이 아니고, 각 폴더의 용량만을 알고 싶은 경우가 있다.
이 경우에는 du -h 명령을 이용한다.
du -h ~/work/cmu/sim
그러면 ~/work/cmu/sim 디렉토리에 있는 파일과 그 하위 디렉토리의 모든 용량을 합한 값을 출력해준다.
파이프 그리고 리다이렉트 (0) | 2019.06.01 |
---|---|
링크 파일 (0) | 2019.05.31 |
압축하고 풀기 (0) | 2019.05.31 |
프로세스 관리 (0) | 2019.05.31 |
리눅스 파일 및 내부 문자열 찾기 (0) | 2019.05.30 |
프로세스는 현재 메모리에 로드되어 있는 프로그램이다.
EDA 툴을 돌릴때 제대로 동작하지 않는 경우가 생기는데, ctrl+z로 해당 프로세스에서 빠져나가는 경우
그 프로세스가 메모리에 계속 로드되어 있는 경우가 있다.
나는 보통 ps u 명령을 통해 내가 사용중인 프로세스 목록을 확인한다.
프로세스에 대한 여러가지 정보를 볼 수 있다.
그리고 kill -9 PID 명령을 통해 죽이고 싶은 프로세스의 ID(PID)를 입력하여 프로세스를 죽인다.
추가적으로, killall 명령은 PID 번호가 아닌 이름으로 프로세스를 중지시키는 방법이다.
killall make*
ctrl+z로 해당 프로세스에서 빠져나간 후 kill %를 하면 바로 이전의 프로세스를 죽일 수 있다.
프로세스를 죽였는데 defunct라고 적힌 것들이 보이는데 이를 좀비 프로세스라고 부른다.
프로세스의 실행이 종료되었지만 아직 정리되지 않은 프로세스를 의미하며, 일번적으로 부모의 프로세스가 자신이 생성한 자식 프로세스를 정리해주어야 하는데, 프로그램 오류나 버그 때문에 부모 프로세스가 실행이 종료된 자식 프로세스를 제대로 정리하지 못해서 생긴다.
참고로 ps -help 명령을 이용하면 ps 명령에 관한 다양한 옵션들을 볼 수 있다.
ps 명령 말고도 프로세스를 모니터링 하는 top 명령어가 있다.
누가 내가 쓰는 머신에서 무슨 프로세스를 돌리고 어느 정도 리소스를 잡아먹고 있는지 체크할 수 있다.
이 프로그램은 1초에 한번씩 계속 정보를 갱신하면서 가장 프로세스를 많이 쓰는 순서로 리스트하여 보여준다.
종료하려면 q를 누르면 된다.
파이프 그리고 리다이렉트 (0) | 2019.06.01 |
---|---|
링크 파일 (0) | 2019.05.31 |
압축하고 풀기 (0) | 2019.05.31 |
용량 체크 (0) | 2019.05.31 |
리눅스 파일 및 내부 문자열 찾기 (0) | 2019.05.30 |
리눅스에서 원하는 파일을 찾고 싶을때, find 명령어를 이용하여 찾을 수 있다.
일을 하다보니 필요하지 않을 수 없었다.
주로 찾고자 하는 이름을 가진 모듈이 어느 폴더에 있는지 알고 싶을 때 자주 쓴다.
큰 파일들은 상당히 많은 내용이 적혀 있기 때문에 일일이 찾으면 시간도 걸리고 실수도 할 수 있으니 grep 명령을 이용하여 어딘가에 있는 특정한 문자열이 포함된 줄을 찾을 수 있다.
grep -v abc list.txt (찾는 패턴이 일치하지 않는 줄만 출력)
grep -n abc list.txt (찾는 패턴과 일치하는 내용이 발견되는 줄 번호 출력)
터미널에 파일 위치에 대한 결과가 나오기 때문에 Vim에서 보고 싶어서 redirect 명령을 활용하여 같이 사용하게 된다.
find ./ -name cmu.v > ../cmu_path.list
이걸 몰랐으면 일일이 모든 디렉토리를 뒤져서 찾으려고 했을 것이다.