[OS-010][실무] 로그인할 때 프로그램 자동 실행하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[OS-010][실무] 로그인할 때 프로그램 자동 실행하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 131회 작성일 26-09-04 22:38

본문

[이번 수업]
로그인할 때 작업을 자동 실행합니다. Linux systemd와 macOS launchd의 등록·확인·해제를 익힙니다.

[선수지식]
프로세스, 서비스, 파일 경로, 셸 명령과 사용자 권한을 알아야 합니다.

[학습목표]
자동 실행을 파일로 정의하고 사용자 범위에 등록한 뒤 결과 확인과 해제까지 할 수 있습니다.

[핵심개념]
systemd는 Linux의 서비스와 시작 순서를 관리합니다. `.service` 단위 파일에 실행 명령과 활성화 대상을 적습니다. `systemctl --user`는 사용자 범위에 명령합니다. `enable --now`는 다음 로그인용 연결을 만들고 지금도 시작합니다. 수정 뒤에는 `daemon-reload`로 다시 읽힙니다.

launchd는 macOS의 작업 관리자입니다. 사용자 작업은 `~/Library/LaunchAgents`의 속성 목록(plist)에 둡니다. `Label`은 고유 이름, `ProgramArguments`는 명령과 인자, `RunAtLoad`는 등록 시 실행 여부입니다. `bootstrap`으로 등록하고 `bootout`으로 해제합니다. 예제는 로그인 세션에서 동작합니다.

자동 실행은 터미널과 환경이 다릅니다. PATH나 현재 폴더를 기대하지 말고 경로를 명확히 쓰며 종료 코드와 로그를 확인합니다.

[따라하기]
공통 작업 파일을 만듭니다.

```sh
mkdir -p "$HOME/os010" "$HOME/.local/state/os010"
printf '%s\n' '#!/bin/sh' 'date "+%Y-%m-%dT%H:%M:%S%z" >> "$HOME/.local/state/os010/run.log"' > "$HOME/os010/run.sh"
chmod 700 "$HOME/os010/run.sh"
"$HOME/os010/run.sh"
tail -n 1 "$HOME/.local/state/os010/run.log"
```

날짜가 보이면 준비 완료입니다. Linux에서는 `~/.config/systemd/user/os010.service`를 만듭니다.

```ini
[Unit]
Description=OS-010 login job
[Service]
Type=oneshot
ExecStart=/bin/sh %h/os010/run.sh
RemainAfterExit=yes
[Install]
WantedBy=default.target
```

`systemctl --user daemon-reload`와 `systemctl --user enable --now os010.service`를 실행합니다. `systemctl --user status os010.service`의 예상 결과는 `active (exited)`입니다. 해제는 `systemctl --user disable --now os010.service`입니다.

macOS에서는 `echo "$HOME"`으로 경로를 확인합니다. `~/Library/LaunchAgents/com.example.os010.plist`를 만들고 `/Users/내이름`을 그 경로로 바꿉니다.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.example.os010</string>
<key>ProgramArguments</key><array><string>/bin/sh</string><string>/Users/내이름/os010/run.sh</string></array>
<key>RunAtLoad</key><true/>
</dict></plist>
```

`plutil -lint ~/Library/LaunchAgents/com.example.os010.plist`의 예상 결과는 `OK`입니다. `launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.os010.plist`로 등록합니다. 상태는 `launchctl print gui/$(id -u)/com.example.os010`, 해제는 `launchctl bootout gui/$(id -u)/com.example.os010`입니다. Windows는 작업 스케줄러를 사용합니다.

[흔한 실수]
상대 경로, 터미널 전용 PATH, 실행 권한 누락이 흔합니다. 먼저 수동 실행과 문법 검사를 하고 수정 뒤 다시 등록합니다.

[보안 주의]
본인 소유의 로컬 환경에서 사용자 권한으로만 실습합니다. 파일을 다른 사용자가 수정하지 못하게 하고 비밀번호나 출처 불명 명령을 넣지 않습니다.

[직접 해볼 과제]
날짜와 `hostname`을 함께 기록하도록 run.sh를 고치세요. 서비스 재시작 뒤 로그를 확인하고 등록을 해제하세요.

[확인문제]
1. 터미널에서 되던 명령이 자동 실행에서 실패하는 까닭은 무엇인가요?
2. systemd 파일 수정 뒤 daemon-reload가 필요한 이유는 무엇인가요?
3. 사용자 서비스와 시스템 서비스의 실행 범위는 어떻게 다른가요?

[다음 학습]
NET-010에서는 통신 진단을, OS-011에서는 정해진 시각의 배치 실행을 배웁니다.

[공식 참고 자료]
- systemd service: https://github.com/systemd/systemd/blob/main/man/systemd.service.xml
- systemctl: https://github.com/systemd/systemd/blob/main/man/systemctl.xml
- Apple launchd: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,592
어제
5,103
최대
16,772
전체
772,646
Copyright © 소유하신 도메인. All rights reserved.