맥북에서 와이파이 연결 시 음소거가 되지만, 이어폰이 연결되었을 때는 예외처리가 되는 기능을 만들었다.
이 기능을 추가하면서 겪은 문제가 있었는데 문제를 해결하는 과정에서 알게 된 것들이 있어 정리한다.
*과정을 담은 글:
맥북에서 특정 와이파이 연결 시 자동 볼륨 조절 스크립트(+이어폰 연결 시엔 예외처리)
[문제 발견]
CURRENT_OUTPUT 을 가져오는 부분을 처음에는 아래처럼 썼었다.
CURRENT_OUTPUT=$(SwitchAudioSource -c)
그런데 테스트를 해보니 이어폰을 꼈는데도 음소거가 되어버렸다.
스크립트 파일을 터미널에서 직접 실행해 봤을 때는 정상 동작해서 음소거가 안되었다.
혹시 출력 장치 이름을 잘못써서 그런가 싶어서 확인을 위해 아래 코드를 스크립트 파일에 추가해서 터미널에서 실행해 봤는데 출력 장치 이름이 정상으로 나왔다.
echo "Current Output Device: $CURRENT_OUTPUT"
출력 결과: 외장 헤드폰
(근데 지금 생각해보니 터미널에서 직접 실행할 때는 정상 동작했으니 이름도 잘 나올 수밖에 없었네..)
[원인 찾기]
이 상황을 봤을 때, launchctl로 실행될때만 뭔가 문제가 있어서 적용이 안되는 거라는 결론을 냈다.
launchctl로 실행될때 기존 코드 부분을 수정하면 그건 잘 반영이 되었기 때문에 출력 장치 이름을 못 찾는 문제인 게 거의 확실했다.
디버깅을 위해 스크립트의 echo 부분은 유지한 채 Property List 설정 파일을 수정했다.
1. Property List 설정 파일 수정
dict 태그 안에 다음 내용을 추가한다.
<key>StandardOutPath</key>
<string>/tmp/wifi-volume-control.out</string>
<key>StandardErrorPath</key>
<string>/tmp/wifi-volume-control.err</string>
저장되는 파일은 순서대로 다음과 같다.
- 표준 출력 로그 (스크립트의 echo 등 출력)
- 표준 에러 로그 (스크립트 오류, 실행 실패 등)
* 참고: /tmp 폴더는 휘발성으로 macOS 재부팅 시 자동으로 초기화된다.
2. 파일 재 적용
plist 파일을 수정했다면 launchctl에 다시 변경 사항을 업데이트 해주어야 한다.
등록했던 실행 파일을 해제한 뒤 다시 적용해주자.
launchctl unload ~/Library/LaunchAgents/com.user.wifi-volume-control.plist 2>/dev/null
launchctl load ~/Library/LaunchAgents/com.user.wifi-volume-control.plist
잘 등록되었는지 확인용:
launchctl list | grep com.user.wifi-volume-control
3. 에러 읽기
터미널에서 다음을 입력해, 출력 결과를 확인해 본다.
cat /tmp/wifi-volume-control.out
cat /tmp/wifi-volume-control.err
나는 다음과 같이 나왔다:
Current Output Device:
/Users/Oto/scripts/wifi-volume-control.sh: line 7: SwitchAudioSource: command not found
오디오 장치 이름이 출력되지 않았고, SwitchAudioSource를 찾을 수 없다고 나왔다.
이름을 못 찾는 원인은 다음과 같다.
LaunchAgent로 실행되면 사용자 터미널 환경과 달라서, PATH가 제한적이기 때문이다.
[해결]
SwitchAudioSource의 전체 경로를 지정해주어야 한다.
1. SwitchAudioSource가 설치된 경로 확인
which SwitchAudioSource
나의 경우는 “/opt/homebrew/bin/SwitchAudioSource”였다.
2. 경로 수정
CURRENT_OUTPUT=$(/opt/homebrew/bin/SwitchAudioSource -c)
⇒ 이렇게 수정하니 정상적으로 동작하였다.
그리고 마지막으로.. 소프트 링크 관련된 문제가 있었다.
이 작업을 하면서 plist 파일을 깃허브 로컬 저장소 쪽으로 옮기고 ~/Library/.. 경로 쪽에 소프트 링크를 걸도록 수정했는데 여기서 문제가 생겼다.
plist 파일을 launchctl에서 해제하고 다시 등록하는 과정에(unload, load) 오류가 났다.
찾아보니 launchctl은 심볼릭 링크가 아닌 실제 경로의 파일이 필요하다고 한다.
그래서 파일을 로컬 저장소 쪽에서 복사해서 사용했더니 문제가 해결되었다.
'프로그래밍' 카테고리의 다른 글
맥북) 특정 폴더로 파일 추가하면 해당 파일 이름을 규칙에 맞게 자동 변경 (0) | 2025.05.08 |
---|---|
맥북에서 특정 와이파이 연결 시 자동 볼륨 조절 스크립트(+이어폰 연결 시엔 예외처리) (0) | 2025.04.24 |
Git 저장소의 핵심: .git 폴더와 git reflog 활용법 (git reset 복구하기) (0) | 2025.03.05 |
[VSCode 에러] 이 시스템에서 스크립트를 실행할 수 없으므로~~~ 해결방법 (0) | 2022.10.26 |
Sourcetree 에러: 잘못된 비밀번호 입력으로 저장소 접근 불가할 때 (0) | 2022.10.15 |