터미널을 사용하다 보면 화면에 출력되는 내용을 저장해야 하는 경우가 생긴다.

 

실험 기록을 남기든, 누군가에게 에러 로그를 전달하든.

 

만약 main.py를 실행시키면서 발생하는 모든 출력 내용 (stdout)을 log.txt 파일에 저장하고 싶다면,

 

아래와 같이 하면 된다.

$ python main.py |& tee -a log.txt

몇 가지 옵션이 있는데,

  • &는 에러 로그 (stderr)도 전달하라는 뜻이다. 빼는 경우 에러 메시지는 저장되지 않는다.
  • -a는 만약 log.txt가 존재하면 새로운 로그 내용을 이전 파일 뒷부분에 추가 (append) 하라는 뜻이다.
    빼는 경우 기존에 존재하는 log.txt를 덮어쓴다.

정도면 충분하지 않을까.

 

 

실험 기록이야 정확한 값이 적절한 자료구조에 들어가 있는 게 중요하기에

 

실제로는 별도의 로깅 클래스를 만들어 사용하지만,

 

남의 코드에서 에러가 났을 때 모양빠지게 캡처본을 전달하기보다는

 

이렇게 log.txt를 만들어서 주는게 훨씬 괜찮은 것 같다.

내가 MATLAB을 썩 좋아하지 않는 이유는

 

(학부 시절 여러 교수님들의 MATLAB 극찬론을 들어왔음에도 불구하고)

 

딱 한 가지는 아니지만, 아무래도 자동화가 힘든 게 주된 원인인 것 같다.

 

 

 

일반적으로 우리가 스크립팅을 해서 실험이나 작업 등을 자동화할 때는

 

쉘 스크립트에 연속된 명령어들을 잔뜩 적어 넣고 이를 실행시킨 다음,

 

내가 자리를 비운 시간 동안 컴퓨터가 멋지게 임무를 완수하기를 기대한다.

 

하지만 MATLAB의 경우 GUI에 상당한 중점을 두고 있다 보니, 아무래도 쉘 환경과는 잘 맞지 않는다.

 

 

다음 명령어는 터미널에서 example.m 파일을 실행 (MATLAB GUI에서 F5를 누르는 것과 동일) 한다.

$ matlab -nodisplay < example.m

-nosplash 옵션을 추가하면 시작 화면을 띄우지 않는다 (참조).

 

물론 -nodisplay 옵션 덕에 화면 자체가 나오지 않기 때문에 시작 화면 또한 볼 일이 없지만

 

체감상 로딩이 조금 빨라지는 것 같다.

 

 

아래와 같은 명령어도 작동한다.

$ matlab -batch -nodisplay -nosplash "example"

형태를 보아하니 MATLAB 커맨드 라인에서 example을 입력하는 것과 동일한 효과가 있는 것 같다.

 

 

위의 형태들은 내가 실행하고 싶은 코드가 항상 고정된 루틴으로 작동할 때 유용하다.

 

하지만 사실 문제는 커맨드 라인 인수를 받아서 동적으로 프로그램을 실행하는 것이다.

 

 

example.m 파일이 아래와 같이 되어있다고 생각해보자.

function x = example(a, b, c)
    disp(a);
    disp(b);
    disp(c);
end

정확한 원리는 모르겠지만, 아래 스크립트를 실행하면 example 함수의 결과를 터미널에서 확인 가능하다.

$ matlab -batch "example(1, 2, 3)"
    1
    2
    3

-batch 대신 -r을 사용하는 것도 가능하다.

 

하지만 이 경우, example 완료된 이후 MATLAB이 종료되지 않고

 

인터프리터 >> 가 그대로 남아 사용자의 입력을 기다린다.

 

자동화에 치명적이므로 -batch를 사용하는 것이 적절해 보인다.

 

이상하게도, -batch와 -r 모두 -nodisplay나 -nosplash 옵션과 함께 사용하면 오류가 발생한다.

 

문자나 문자열을 인수로 넣어주는 경우에는 작은따옴표로 인수들을 감싸주자.

$ matlab -batch "example('1', 2, 3)"
1
    2
    3

MATLAB에서 문자와 숫자를 출력하는 법이 달라, 문자는 왼쪽에 딱 붙어서 출력되는 것을 확인할 수 있다.

 

 

함수형으로 되어있지 않은 코드는 실행하면서 특정 변수에 동적인 값을 할당하는 것이 굉장히 까다롭다.

 

가능하다면 MATLAB 사용을 최소한으로 하는 게 쓰기도 좋고 보기도 좋은 스크립트를 만드는 데에 도움이 되지 않을까.

ssh를 사용하면서 가장 귀찮은 것 중 하나가 비밀번호 입력이다.

 

물론 대부분의 사람들이 해킹당하면 변명의 여지조차 없는 비밀번호를 즐겨 사용하는 것은 맞지만

 

그래도 형식상으로는 입력해줘야 하니까.

 

 

다행(?)스럽게도, 바로 전 글의 ssh 서버에 닉네임 붙여 사용하는 법과 함께 적용하면

 

비밀번호 입력 없이 한 번에 ssh 접속을 할 수 있게 하는 설정 방법이 있다.

 

쉽게 말해서 연구실에 출입 카드를 찍고 드나드는 느낌인데

 

해당 출입 카드를 내 로컬 PC에 저장해 놓는다는 컨셉이다.

 

 

아래와 같은 명령어로 출입 카드를 만들 수 있다.

$ ssh-keygen -t rsa -b 2048

이는 RSA 타입의 2048비트 키를 만들겠다는 의미이다.

 

우리가 원하는 것은 보안을 희생한 일방적인 편의성이기 때문에, 뒤에 몇 가지를 물어보면 엔터로 일관해주면 된다.

 

 

해당 명령어의 실행을 마치면 .ssh 폴더 아래에 id_rsa와 id_rsa.pub라는 파일 두 개가 생긴다.

 

여기서 id_rsa.pub라는 파일이 내 신원 정보를 가지고 있고, id_rsa가 내 출입 카드라고 생각하면 된다.

 

당연히 id_rsa는 나만 가지고 있어야 한다.

 

출입 카드를 사용하려면 내 신원 정보를 서버에 등록할 필요가 있다.

 

사실 id_rsa.pub 파일은 그냥 텍스트이기 때문에

 

해당 내용을 서버의 어딘가에 잘 붙여 넣으면 등록이 완료된다.

 

하지만 이는 굉장히 번거로운 작업이기에 아래 명령어로 한 번에 처리하도록 하자.

$ ssh-copy-id [닉네임]
# 혹은,
$ ssh-copy-id -p [Port 번호] [사용자 이름]@[IP 주소 혹은 도메인]

해당 명령어를 입력하면 .

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: - key(s) remain to be installed -- if you are prompted now it is to install the new keys

같은 내용이 나오며 비밀번호를 입력하라고 하는데,

 

이전에 서버 접속을 위해 사용하던 비밀번호를 입력하면 신원 등록이 완료된다.

 

이제

$ ssh [닉네임]

으로 비밀번호 입력마저 없이 한 번에 서버에 접속할 수 있다.

 

 

여담으로 접속한 서버에서

$ vi ~/.ssh/authorized_keys

로 파일을 열어보면, 내 id_rsa.pub의 내용이 잘 복사되어 있는 것을 확인 할 수 있다.

현재 연구실 작업 환경이 [로컬 + 연구실 서버]를 중심으로 되어 있어, ssh 접속을 굉장히 자주 사용하게 된다.

 

하지만 이를 위해 접속 IP나 도메인을 매 번 입력해 주는 것은 번거로우며, 기억하기도 쉽지 않다.

 

이에 대한 멋진 솔루션을 1년 정도 전에 재린이에게 배웠지만,

 

아직 연구실의 많은 사람이 수동으로 IP를 입력해서 원하는 서버에 접속하는 것 같다.

 

사실 굉장히 간단한 기능이고 필수적인 요소가 아니긴 하지만,

 

오히려 그렇기에 사람들에게 많이 알려져 있지 않은가 하는 생각도 든다.

 

 

Ubuntu의 경우, 아래와 같이 설정하면 임의의 IP나 도메인닉네임을 붙여 ssh 접속이 가능하다.

 

먼저 ssh config 파일을 아래와 같이 연다.

$ vi ~/.ssh/config

만약 폴더가 존재하지 않아 에러가 생긴다면 새로 만들어주면 된다.

$ mkdir ~/.ssh

이렇게 해서 연 config 파일에 아래와 같이 입력해주고 저장하면 완료.

Host [닉네임]
    HostName [IP 주소]
    Port [Port 번호]
    User [사용자 이름]
    IdentityFile [Key 파일 위치]

여기서 IdentityFile은 인증키를 포함하고 있는 파일인데 우리 연구실에서는 별도로 쓰지 않고 있다.

 

키가 필요하지 않은 경우 해당 라인을 지우면 되고,

 

Google Cloud 등을 사용하면 접속에 .pem 파일이 필요할 때가 있는데 이럴 때 사용하면 된다.

 

 

설정이 완료된 후에는 아래와 같이 한 방에 ssh 접속이 가능하다.

$ ssh [닉네임]

ssh protocol을 사용하는 다른 명령어(scp 등)에도 일괄적으로 적용된다.

 

또한, 명령어에 다른 argument를 넣어주면 기존 config 파일에 설정했던 내용이 override 되는 것으로 보인다.

# Local의 파일 abc.txt를 서버 해당 유저의 root directory에 복사
$ scp abc.txt [닉네임]:.

# Port 번호를 8023으로 바꿔서 접속
$ ssh -p 8023 [닉네임]

 

다만 아직까지는 비밀번호를 반복적으로 입력해야 한다는 귀찮은 점이 남아있는데,

 

이후에 설명할 ssh key를 활용하면 이것까지 한 번에 해결된다.

비단 나만의 이야기가 아닌 것은 알지만, 지난 1년간 좋지 않은 방향으로 많은 일들이 있었다.

 

올 초에 나의 심리적 안정이 최저점을 찍고 난 뒤 다행히 많은 회복을 하였지만

 

아직도 생각할 게 많은 시간을 보내고 있다.

 

 

요즘 내 주변의 좋은 사람들로부터 많은 긍정적 자극을 받지만

 

성격상 이러한 자극을 나의 에너지로 돌리는 데에 약간의 어려움이 있었다.

 

그러던 와중, 어제 엄마가 재미있는 것을 발견하셨다.

 

크게 대단한 것은 아니고, 2년 전 미국에 있을 때 집으로 쓴 엽서였다.

 

 

나는 해외에 나가면 집으로 엽서를 한 장씩 보내곤 한다.

 

이러한 습관은 아빠로부터 배운 것인데,

 

지금도 우리 집 한쪽 창가에는 아빠가 놀러 가셨다가 보냈던 엽서가 줄줄이 장식되어 있다.

 

 

사실 엽서 쓰기는 '배운다'라는 표현이 무색할 정도로 어렵지 않은 것이다.

 

다만 내 성격과 비슷한 점은, 엽서를 써야겠다는 생각 자체는 누구나 할 수 있지만

 

이를 실천에 옮기기가 생각보다 쉽지 않다는 것이다.

 

멋진 엽서를 한 장 준비하고, 엽서에 붙일 우표를 사기 위해 우체국을 찾고,

 

적당한 멘트를 생각해 손글씨로 엽서를 채우고, 우체통을 찾아 넣은 다음,

 

한국으로 돌아와 하염없이 기다리는 것은

 

떼어놓고 보면 별 거 아니지만, 한 번에 하려면 약간 귀찮은 -모바일 게임의 일일 퀘스트 같은-

 

숙제의 느낌이 나기도 한다.

 

 

저러한 일련의 과정 중에서, 의외로 어렵지 않은 것은 엽서를 채우는 단계이다.

 

엽서를 써보지 않은 사람들은

 

예쁜 그림이나 풍경 뒤의 하얀 여백 또한 굉장히 멋진 문구로 채워야 할 것이라고 생각하지만,

 

실제로 내가 (그리고 아빠가) 쓴 것을 가만히 보고 있으면

 

잘 조율된 악단의 느낌보다는 즉흥적으로 떠올리는 노상의 버스킹에 가까운 테이스트가 느껴진다.

 

다만 이렇게 예측할 수 없기에, 받는 사람에게는 오히려 더 큰 즐거움이 되기도 하고

 

이를 2년 뒤에 꺼내보는 나 자신도 "내가 저 때는 저런 기분이었나" 하는 신선함을 느끼게 해 준다.

 

 

생각하며 주변을 돌아보니,

 

준비는 조금 귀찮지만 누군가에게 즐거움과 도움을 주고, 미래에 다시 돌아보면 다양한 생각을 할 수 있는

 

그런 무언가가 하나 있으면 괜찮겠다 라는 생각이 들었다.

 

이런 생각과 동시에, 진작에 했으면 더 좋지 않았을까 하는 후회 또한 들지만

 

늦었다고 생각할 때가 가장 빠른 순간이니까.

+ Recent posts