VPN 클라이언트가 애플리케이션 메뉴에서 시작되고 터널은 연결되지만, 한 컴퓨터에서는 로그인 후 아이콘이 전혀 나타나지 않고 같은 패키지가 다른 컴퓨터에서는 제대로 동작한다. 세 가지 관찰이 하나의 불만으로 뭉쳐 있다. 프로그램이 시작되었는지, 인터페이스가 보이는지, 터널이 올라와 있는지다. 실행기는 필터링 키가 있는 데스크톱 항목으로 제어되며, 그 항목은 VPN 프로토콜과 아무 관련이 없다. 절차서를 순서대로 진행하고 세 가지 중 하나가 깔끔하게 분리되면 멈춘다.

세 가지 별개의 사실: 시작, 아이콘, 터널

데스크톱 항목은 프로그램을 시작한다. 트레이 구현을 설치할 수 없고, 애플리케이션이 쓰는 프로토콜을 지원하지 않는 패널에 표시기를 띄울 수도 없다. 프로세스가 이미 실행 중이라면 시작에 대한 질문은 답이 난 것이고, 대신 통합 문제를 보고 있는 셈이다.

터널은 또 하나의 세 번째 사실이다. 아이콘이 없다고 연결이 끊긴 증거는 아니며, 아이콘을 «고치려고» 클라이언트를 죽였다 다시 시작하는 것이야말로 멀쩡한 터널을 이유 없이 끊는 방법이다. 사용자는 사라진 아이콘과 끊긴 터널을 한 문장으로 보고한다. 그래서 둘을 종이 위에서 분리해야 한다.

무엇이든 바꾸기 전에 분리한다. 프로세스가 있는지, 다음으로 패널이 표시기를 지원하는지, 마지막으로 인터페이스가 연결을 보고하는지 확인한다. 각 답은 서로 다른 계층과 서로 다른 담당자를 가리킨다.

세션이 실제로 읽는 항목을 찾는다

자동 시작 항목은 사용자 디렉터리와 시스템 디렉터리에 있으며, 파일 이름이 같으면 사용자 사본이 이긴다. 잘못된 항목을 읽는 것이 변경이 효과 없어 보이는 가장 흔한 이유다. 무엇이든 편집하기 전에 두 디렉터리를 모두 나열하고 세션이 실제로 어떤 파일을 불러올지 적어 둔다.

ls -l ~/.config/autostart/ /etc/xdg/autostart/
echo "$XDG_CURRENT_DESKTOP"
grep -H -E '^(OnlyShowIn|NotShowIn|TryExec|Hidden|Exec)=' ~/.config/autostart/*.desktop /etc/xdg/autostart/*.desktop

환경 변수는 필터링 키를 비교하는 세션 이름을 출력하며, 보통 콜론으로 구분된 목록이다. 항목의 값과 문자 그대로 비교한다. 그 이름들은 세션에 대한 설명이 아니라 대소문자를 구분하는 구성 세부 정보이기 때문이다. 값 GNOME은 gnome과 일치하지 않으며, 그 결과 생기는 침묵에는 어떤 오류 메시지도 붙지 않는다. 추측하지 말고 출력한다.

같은 파일 이름이 두 디렉터리에 모두 있으면 사용자 사본이 중요하다. 시스템 파일을 편집하고 왜 아무것도 바뀌지 않았는지 궁리하는 것은 아주 흔한 낭비되는 한 시간이다.

필터링 키를 순서대로 읽는다

아래 예시 항목은 세션이 프로그램을 시작할지 결정하는 키를 보여 준다. 이것은 완전한 실행기가 아닌 단편이며, 값은 가상의 경로에 속한다.

[Desktop Entry]
Type=Application
Name=Example VPN
Exec=/opt/example-vpn/client --minimized
TryExec=/opt/example-vpn/client
OnlyShowIn=GNOME;

OnlyShowIn 항목을 나열된 환경으로 제한하고 NotShowIn 나열된 환경을 제외한다. 둘이 한 항목에 함께 나올 때의 유용한 동작은 명세에 정의되어 있지 않으므로, 둘을 모두 담은 파일은 영리한 조합이 아니라 결함으로 취급한다. 두 번째를 더하고 우선순위 규칙을 기대하는 대신 필요 없는 키를 제거한다.

TryExec 세션이 실행하기 전에 실행 파일이 있는지 묻는다. 그래서 옛 설치에서 남은 경로는 새 패키지가 메뉴에서 실행될 때 동작하더라도 자동 시작을 억제하며, 그 실패는 데스크톱 필터와 똑같이 보인다.

시스템 수준이 아니라 사용자 수준에서 재정의한다

이 컴퓨터에 필터가 정말로 잘못된 경우 시스템 항목을 사용자 디렉터리로 복사하고 사본을 바꾼다. XDG 자동 시작 규칙에 따라 같은 이름의 사용자 항목이 우선하며, Hidden=true 시스템 파일을 지우지 않고 항목을 비활성화한다.

mkdir -p ~/.config/autostart
cp /etc/xdg/autostart/example-vpn.desktop ~/.config/autostart/
sed -i '/^OnlyShowIn=/d' ~/.config/autostart/example-vpn.desktop
desktop-file-validate ~/.config/autostart/example-vpn.desktop

로그아웃하기 전에 결과를 검증한다. 잘못된 형식의 항목은 조용히 무시되고 다음 테스트는 아무것도 알려 주지 않는다. 패키지를 다시 설치해도 재정의는 사라지지 않으며, 그것이 핵심이자 존재를 기록해 두는 이유다. 티켓에 파일 경로를 적어 다음 사람이 재정의를 다시 도출하지 않고 찾도록 한다.

공유 시스템 실행기를 편집하는 대신 이 방법을 택한다. 공유 실행기는 컴퓨터의 모든 사용자 동작을 바꾸고 같은 방식으로 검토할 수 없다. 사용자 수준 재정의는 한곳에서 보이고 파일 하나를 지워 되돌릴 수 있으며 티켓에서 설명하기 쉽다. 시스템 파일은 공급업체가 보낸 그대로 남으므로 패키지 업데이트가 당신의 추론을 조용히 무효화하지 않는다.

터널을 건드리지 않고 시작을 확인한다

로그아웃했다가 다시 로그인한 뒤, 패널을 보기 전에 프로세스가 있는지 확인한다. 성공적인 시작과 보이는 아이콘은 서로 다른 두 결과다, 그리고 두 번째만 데스크톱 통합 작업이 필요하다. 둘을 혼동하면 내내 동작하던 패키지를 다시 설치하러 가게 된다.

pgrep -af example-vpn
systemctl --user status example-vpn.service
journalctl --user -b --no-pager | grep -i example-vpn | tail -20

프로세스가 없으면 남은 필터나 오래된 TryExec 경로가 있는지 항목을 다시 읽는다. 있다면 실행기는 동작한 것이고, 사라진 아이콘은 패널의 표시기 지원에 관한 별개의 문제이지 방금 편집한 항목의 문제가 아니다.

티켓에 세 가지 관찰을 기록한다. 시작됨, 보임, 연결됨. 그 기록은 다음 사람이 같은 삼중 혼동을 되풀이하지 않게 하고 어느 계층에 아직 작업이 필요한지 분명히 한다.

관련 글