Linux에서 일시 중단 및 재개 시 스크립트 및 명령을 실행하는 방법

일시 중단 및 재개 시점에 Linux 시스템에서 스크립트나 명령을 실행하는 가장 효율적인 방법은 systemd init 시스템을 활용하는 것입니다. systemd는 커널 및 전원 관리 시스템과 직접적으로 소통하기 때문에 이러한 작업에 최적화되어 있습니다. systemd를 능숙하게 다루면 Linux 운영 체제에 대한 제어력을 크게 향상시킬 수 있습니다.

주의: systemd init 시스템을 잘못 조작하는 것은 시스템에 심각한 문제를 일으킬 수 있습니다. 따라서 이 튜토리얼의 지침을 정확히 따르도록 주의해야 합니다.

모든 Linux 배포판이 systemd를 사용하는 것은 아닙니다. 일부는 upstart나 다른 init 시스템을 사용합니다. 이 가이드에서는 가장 널리 사용되는 systemd에 초점을 맞춥니다. 만약 사용 중인 시스템이 systemd를 사용하지 않는다면, 해당 운영 체제의 설명서를 참조하여 유사한 기능을 구현하는 방법을 찾아보세요.

참고: Debian 사용자는 `/usr/lib/systemd/system-sleep` 경로를 모두 `/lib/systemd/system-sleep/`로 변경해야 합니다.

일시 중단 전 스크립트 실행

일시 중단 전에 스크립트를 실행하려면 `/usr/lib/systemd/system-sleep/` 디렉토리에 Bash 스크립트 파일을 생성해야 합니다. 스크립트 내용은 원하는 대로 설정할 수 있지만, 특정 형식을 준수해야 합니다. 터미널을 열고 `sudo -s` 명령으로 루트 권한을 얻습니다.

이제 다음 명령을 사용하여 system-sleep 디렉토리 내에서 nano 편집기를 실행합니다.

nano /usr/lib/systemd/system-sleep/pre-suspend.sh

스크립트의 첫 줄에는 shebang을 추가해야 합니다. 이는 스크립트 인터프리터가 코드를 올바르게 인식하고 실행하는 데 필수적입니다.

#!/bin/bash/

다음으로 `if` 구문을 추가합니다. 이는 전원 시스템에 시스템이 일시 중단될 때 어떤 명령을 실행할지 알려주는 역할을 합니다. 아래 코드를 붙여 넣습니다.

if [ "${1}" == "pre" ]; then
sh /path/to/script/to/run.sh

`/path/to/script/to/run.sh` 부분을 실제 실행하려는 스크립트의 경로로 변경합니다. `if` 구문 바로 다음에 `sh` 명령이 아니라 다른 명령을 사용할 수도 있습니다. Bash가 명령으로 인식할 수만 있다면 정상적으로 실행됩니다.

스크립트의 마지막 부분은 `elif` 구문을 추가하는 것입니다. 여기서는 시스템이 다시 깨어날 때가 아닌, 시스템이 종료되기 전에 수행할 작업에 초점을 맞추고 있으므로 이 부분을 수정할 필요는 없습니다.

elif [ "${1}" == "post" ]; then
# 아무것도 입력하지 않음
fi

모든 내용이 추가되었다면 `Ctrl + O`를 눌러 파일을 저장합니다.

재개 후 스크립트 실행

재개 후 스크립트를 실행하는 과정은 일시 중단 전 스크립트 실행과 매우 유사합니다. 유일한 차이점은 스크립트 내에서 `if` 구문 다음에 명령을 추가하는 것이 아니라 `elif` 구문 다음에 코드를 추가한다는 점입니다.

재개 후 스크립트를 작성하려면 먼저 shebang을 첫 번째 줄에 추가합니다.

#!bin/bash

다음으로 스크립트의 `if` 구문을 추가합니다.

if [ "${1}" == "pre" ]; then
# 아무것도 입력하지 않음

해당 코드 부분을 bash 스크립트에 추가하고, `elif` 구문을 추가합니다.

elif [ "${1}" == "post" ]; then
sh /path/to/script/to/run.sh
fi

`elif` 구문 아래에도 원하는 명령을 추가할 수 있습니다. systemd와 Bash는 일반적인 명령 작업이라면 문제없이 실행합니다.

일시 중단 및 재개 시 모두 스크립트 실행

일시 중단 전에 한 가지 명령을 실행하고, 재개 후에 다른 명령을 실행하고 싶을 수도 있습니다. 이는 스크립트를 사용자 정의하고 `if` 구문과 `elif` 구문 아래에 명령을 추가하는 방식으로 가능합니다.

먼저, 인터프리터를 위해 스크립트에 shebang을 추가합니다.

#!/bin/bash

그 다음, 코드의 `if` 섹션을 추가합니다.

if [ "${1}" == "pre" ]; then
# 명령으로 변경

`if` 구문 아래의 `# 명령으로 변경` 부분을 시스템이 종료되기 직전에 실행하려는 명령으로 변경합니다. 그 다음, `elif` 섹션으로 이동하여 같은 작업을 수행합니다.

elif [ "${1}" == "post" ]; then
# 명령으로 변경
fi

`Ctrl + O`를 눌러 파일을 저장합니다.

스크립트 권한 업데이트 및 사용

스크립트 파일 내부에 필요한 모든 명령이 있지만, 실행하기 전에 권한을 업데이트해야 합니다. 터미널을 열고 `su` 또는 `sudo -s`를 사용하여 루트 권한을 얻습니다. 그런 다음 다음 명령을 실행합니다.

chmod +x /usr/lib/systemd/system-sleep/pre-suspend.sh

이제부터 시스템을 일시 중단하거나 재개할 때마다 스크립트 내부에 정의된 사용자 지정 명령이 실행됩니다.

참고: systemd system-sleep에 대한 질문이 있으신가요? `man systemd-suspend.service` 명령을 사용하여 매뉴얼을 참조하세요.