시스템 실행과 일반 쉘 실행의 비교?

시스템 실행과 일반 쉘 실행의 비교?

시스템 서비스가 시작 시 x분마다 스크립트를 실행하도록 하려고 합니다. 스크립트의 단계 중 하나는 VPN 연결을 설정하는 것입니다. 이 단계는 systemd 서비스로 실행될 때 실패합니다.

서비스 파일:

[Unit]
Description=Run the checkvpn bash script

[Service]
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ExecStart=/usr/local/bin/checkvpn.sh

타이머 파일

[Unit]
Description=checkvpn service timer

[Timer]
OnActiveSec=60
OnCalendar=*-*-* *:*:00
Unit=checkvpn.service

[Install]
WantedBy=multi-user.target

배시 스크립트:

#!/bin/bash -l
if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

isVpnConnected() {
  if [[ $(cyberghostvpn --status) =~ "Wireguard connection found" ]]; then
    return 0
  else
    return 1
  fi
}

isDockerRunning() {
  if [[ $(docker ps) =~ "some-docker-image" ]]; then
    return 0
  else 
    return 1
  fi
}

if isVpnConnected; then
  if isDockerRunning; then
    echo "vpn and docker ok"
  else
    echo "vpn ok, but docker is not running, starting docker ..."
    docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml up -d
  fi
else
  echo "vpn not ok, connecting ..."
  cyberghostvpn --traffic --wireguard --country-code ES --connect
  if isVpnConnected; then
    if isDockerRunning; then
      echo "vpn restored, but docker was still running without vpn"
    else
      echo "vpn fixed, restarting docker ..."
      docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml up -d
    fi
  else
   echo "unable to fix vpn, stopping dockers ..."
   docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml down
  fi
fi

내가 얻는 오류 :

Feb 12 14:14:02 nookie checkvpn.sh[8490]: Traceback (most recent call last):
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "cyberghostvpn.py", line 5, in <module>
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "/usr/local/lib/python3.8/dist-packages/PyInstaller/loader/pyimod03_importers.py", line 623, in exec_module
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "configs/base.py", line 3, in <module>
Feb 12 14:14:02 nookie checkvpn.sh[8490]:   File "configs/base.py", line 12, in BaseConfiguration
Feb 12 14:14:02 nookie checkvpn.sh[8490]: TypeError: can only concatenate str (not "NoneType") to str
Feb 12 14:14:02 nookie checkvpn.sh[8490]: [8490] Failed to execute script cyberghostvpn

분명히 Cyberghost cli 유틸리티는 Python으로 작성되었으며 무언가를 가져올 수 없습니다. systemd 환경이 내 사용자 환경과 다르다고 가정하고 있지만 정확히 무엇인지는 모르겠습니다. 또한 내 사용자 환경에 있는 것과 동일한 경로 변수를 제공하려고 시도했지만 아무것도 해결되지 않았습니다.

어떤 아이디어가 있나요?

davy@nookie의 출력: ~$ sudo find / -name "cybergho*"

    /home/davy/cyberghostvpn-ubuntu-20.04-1.3.4
    /home/davy/cyberghostvpn-ubuntu-20.04-1.3.4/cyberghost
    /home/davy/cyberghostvpn-ubuntu-20.04-1.3.4/cyberghost/cyberghostvpn
    /home/davy/cyberghost
    find: ‘/proc/6687’: No such file or directory
    /usr/bin/cyberghostvpn
    /usr/local/cyberghost
    /usr/local/cyberghost/cyberghostvpn
    /etc/wireguard/cyberghost.conf

답변1

systemd 환경이 내 사용자 환경과 다르다고 가정하고 있는데 어떻게 되는지는 모르겠습니다.

(매우) 짧은 스크립트를 통해 알아낼 수 있습니다.

#!/bin/bash
printenv > /home/davy/environment_"$( date +%s )"

스크립트는 printenv모든 환경 변수를 나열하는 명령을 실행한 다음 출력을 에 저장합니다 /home/davy/environment_xxxxxxxxxx.xxxxxxxxxx파일 이름의 일부는 초 단위의 현재 Unix 타임스탬프입니다. (제가 이 특정 파일 이름을 선택한 유일한 이유는 스크립트가 실행될 때마다 파일을 덮어쓰지 않기 위해서입니다. 하지만 이름과 저장 위치는 분명히 원하는 대로 변경할 수 있습니다. 원하는 콘텐츠)).

systemd.service생성된 파일과 쉘을 사용하여 동일한 스크립트를 실행할 때 생성된 파일을 비교할 수 있도록 이 스크립트를 실행하십시오 sudo. 이 두 파일의 차이점을 통해 알 수 있습니다 systemd.

이것은 있을 법하지 않은 일이며 작동한다면 놀랄 것입니다. 그러나 Vars변수(한 줄에 하나씩, 형식으로)만 나열하는 파일(또는 원하는 이름)을 만들어 볼 수 있습니다. 출력은 정확히 다음과 같습니다. same printenv)이 존재 sudo하지만 존재하지 않는 systemd경우 파일 Environment=PATH=...의 줄을 .service로 변경한 EnvironmentFile=/path/to/Vars다음 를 사용하여 서비스를 다시 시작합니다 sudo systemctl daemon-reload.

FWIW, 사용자가 Cyberghost로 자동화를 시도했을 때 cron다른 곳에서 언급된 것과 똑같은 Python 오류를 발견했습니다. 그는 제가 이해하지 못하고 보장할 수 없는 방식으로 작업할 수 있었지만 아마도 더 나은 결과를 얻을 수 있을 것입니다. 운:

https://forum.ubuntu-fr.org/viewtopic.php?id=2060369(프랑스 국민)

(영어 번역)

관련 정보