[리눅스] The following packages have been kept back 원인과 해결 방법

 

우분투에서 sudo apt-get upgrade 실행 시 다음과 같은 메시지가 나오면서 업그레이드가 안 되는 경우가 종종 있습니다.

$ sudo apt-get upgrade

The following packages have been kept back:
  dkms ubuntu-advantage-tools
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

$

 

이는 기존에 설치되어 있던 프로그램 중에서 의존성이 변경된 경우가 있어서 업그레이드를 위해서는 기존에 컴퓨터에 설치되어 있지 않던 프로그램을 새로 설치해야 할 경우에 나타나는 경고 메시지입니다. 위 예제의 경우 dkmsubuntu-advantage-tools를 업그레이드 하기 위해서는 기존에 없던 프로그램들을 새로 설치해야 하기 때문에 경고만 해 주고 업그레이드를 실행하지 않은 것입니다.

 

이런 경우 새롭게 필요한 프로그램들을 추가로 설치하면서 apt-get upgrade를 실행하려면 다음과 같이 --with-new-pkgs 옵션을 주면 됩니다. 말 그대로 '새로운 패키지와 함께 (with new packages)' 업그레이드를 진행하라는 옵션입니다. 해당 옵션을 주었더니 새롭게 dctrl-toolsubuntu-pro-client-l10n 두 종류의 프로그램을 설치하면서 dkmsubuntu-advantage-tools를 업그레이드하는 것을 볼 수 있습니다.

$ sudo apt-get --with-new-pkgs upgrade

Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  dctrl-tools ubuntu-pro-client-l10n
The following packages will be upgraded:
  dkms ubuntu-advantage-tools
2 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 349 kB of archives.
After this operation, 590 kB of additional disk space will be used.
Do you want to continue? [Y/n]

$

 

한편 이렇게까지 해도 안 되는 경우가 있다면 다음과 같이 aptitude를 설치하신 후에 aptitude를 통해 업그레이드를 진행하는 방법도 있습니다. 하지만 대부분 여기까지 오지 않아도 위의 방법으로 해결이 될 것입니다.

$ sudo apt-get install aptitude -y
$ sudo aptitude safe-upgrade

[리눅스] Bash Shell에서 파일 존재 여부 검사 시 -e와 -f 옵션의 차이

 

Bash Shell에서 파일 존재 여부 검사 시 -e와 -f 옵션을 사용할 수 있는데, -e는 단순히 파일이 존재하는지만 검사하고 -f는 해당 경로에 있는 것이 디렉토리나 마운트 된 기기 등이 아니라 정말로 파일인지까지 검사해줍니다. 보통 if문 안에서 다음과 같이 사용하게 되지요.

 

# 해당 운영체제가 우분투인지를 검사하는 코드입니다.
if [[ -f /etc/lsb-release ]];

 

참조한 곳: https://linuxize.com/post/bash-check-if-file-exists/

[리눅스] 특정 디렉토리 내 파일 개수 보기


ls -l | grep ^- | wc -l


라고 치시면 현재 디렉토리 내에 있는 파일의 개수를 보실 수 있습니다.

[리눅스] cat 사용법


cat은 연결한다는 뜻의 영단어 concatenate의 약자입니다. cat은 인자로 받은 문자열이나 파일을 다 이어붙여서 하나로 만들어서 출력합니다. 예를 들어


cat 파일1 파일2 파일3


이라고 쓰면 파일1, 파일2, 파일3의 내용이 순서대로 연결되어 화면에 출력됩니다.


이 성질을 사용해서 cat으로 파일의 내용을 볼 수 있습니다.


cat 파일1


이라고 하면 딱히 연결시킬 다른 파일이 없기 때문에 파일1의 내용만 화면에 출력됩니다.


그냥 cat이라고만 치면 키보드에서 입력을 받아서 화면에 출력합니다. 이것을 리다이렉션(>)을 사용해서 파일에 바로 저장할 수 있습니다. 입력을 마칠 때에는 새 줄의 맨 처음에서 ctrl+d를 누르시면 됩니다. 예를 들면 다음과 같습니다.


cat > 여기에저장.txt


cat에는 많은 옵션이 있습니다. 그 중 유용한 것 두 가지를 소개합니다.


-ve


-ve는 각 줄의 맽 끝을 $ 기호로 표시해주는 옵션입니다. 줄 맨 끝에 공백이 있을 경우 유용합니다.


-n


-n은 줄마다 1, 2, 3 등의 줄번호를 붙여서 출력하는 옵션입니다.


[리눅스] 특정 mime 형식의 파일만 출력하기 (예제: jpeg 파일만 출력)


find ./ -type f -exec file --mime-type {}  \; | awk '{if ($NF != "image/jpeg") print $0 }'


이렇게 하면 jpeg 형식의 파일만 출력됩니다. 다른 형식의 파일을 찾아보고 싶으시면 "image/jpeg" 부분을 바꾸시면 됩니다.

아래 명령어로 리눅스 종류와 버전을 확인할 수 있습니다.


grep . /etc/*-release


제가 사용하는 서버에서는 아래와 같은 결과가 나오네요.


/etc/centos-release:CentOS Linux release 7.4.1708 (Core) 

/etc/os-release:NAME="CentOS Linux"

/etc/os-release:VERSION="7 (Core)"

/etc/os-release:ID="centos"

/etc/os-release:ID_LIKE="rhel fedora"

/etc/os-release:VERSION_ID="7"

/etc/os-release:PRETTY_NAME="CentOS Linux 7 (Core)"

/etc/os-release:ANSI_COLOR="0;31"

/etc/os-release:CPE_NAME="cpe:/o:centos:centos:7"

/etc/os-release:HOME_URL="https://www.centos.org/"

/etc/os-release:BUG_REPORT_URL="https://bugs.centos.org/"

/etc/os-release:CENTOS_MANTISBT_PROJECT="CentOS-7"

/etc/os-release:CENTOS_MANTISBT_PROJECT_VERSION="7"

/etc/os-release:REDHAT_SUPPORT_PRODUCT="centos"

/etc/os-release:REDHAT_SUPPORT_PRODUCT_VERSION="7"

/etc/redhat-release:CentOS Linux release 7.4.1708 (Core) 

/etc/system-release:CentOS Linux release 7.4.1708 (Core)

리눅스에서 프로그램을 돌려 놓고 한참 뒤에 보면 화면에 Killed 라는 글만 떠 있고 프로세스가 죽어 있는 경우가 가끔 있습니다.

그럴 때에는

dmesg | grep -E -i -B100 'killed process'

라고 치면 프로세스가 강제 종료될 때의 상황을 자세히 볼 수 있습니다.

제 경우에는 대부분 Out of memory가 원인이었습니다.


(참고한 자료: https://stackoverflow.com/questions/726690/who-killed-my-process-and-why)

+ Recent posts