systemd에서는 스크립트를 완전히 실행할 수 없습니다.

systemd에서는 스크립트를 완전히 실행할 수 없습니다.

밝음/어두움 모드를 전환하는 Python 스크립트가 있습니다.

마지막에는 다음 줄이 있습니다.

process = subprocess.Popen(binDir + "/polybar.sh")

그것이 가리키는 스크립트는 다음과 같습니다.

#!/bin/env bash

# Terminate already running bar instances
killall -q polybar
polybar >/dev/null 2>/dev/null

터미널에서 밝은/어두운 스크립트를 실행하면 완벽하게 실행되고 폴리바가 종료된 다음 다시 시작됩니다.

하지만 시간에 따라 서비스가 자동으로 전환되기를 원했기 때문에 시스템 타이머를 만들었습니다. 밝은/어두운 스크립트가 실행되고 대부분 작동하지만 이 스크립트는 특히 그렇지 않습니다. Polybar가 종료되고 다시 시작되지 않습니다. systemd 서비스는 사용자 서비스입니다.

이 문제를 해결하는 방법을 모르겠습니다. systemctl status정보가 제공되지 않습니다.

터미널에서 시작할 때는 스크립트가 작동하지만 systemd에서 시작할 때는 작동하지 않는 이유는 무엇입니까?

서비스 파일은 다음과 같습니다.

[Unit]
Type=simple
Description=dark mode
Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/{{ user }}/bin"
WorkingDirectory=/home/{{ user }}/bin

[Service]
ExecStartPre=/usr/bin/brightnessctl s 200
ExecStart=/usr/bin/python /home/ger/bin/nutra.py dark

타이머:

[Unit]
Description=Turn screen dark/light at certain times

[Timer]
OnCalendar=*-*-* 18:13:00
Persistent=true


[Install]
WantedBy=timers.target

답변1

cron작업이나 스크립트 실행 또는 시작 systemd스크립트는 데스크탑의 동일한 런타임 환경에서 실행되지 않습니다. 로 스크립트를 시작합니다 root. 변경 사항이나 기타 환경 변수 설정은 작업 에 자동으로 전파 PATH되지 않습니다 . 예를 들어 no 이므로 GUI 프로그램에는 특별한 처리(읽기 )가 필요합니다.~/.bashrccron$DISPLAYman xhost

cron환경 변수는 모든 작업에 대한 읽기 파일에서 설정할 수 있습니다 .crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias각 환경의 결과를 확인하세요.
간단한 접근 방식은 명령을 bash스크립트에 저장하고 터미널 세션에서 실행하고 출력을 저장한 다음 "다른" 환경에서 스크립트를 실행하고 출력을 저장하는 것입니다. Compare 를 사용하여 출력을 저장합니다 diff.

echo "=== id ===";id
echo "=== set ===";set
echo "=== env ===";env | sort
echo "=== alias ===";alias`

관련 정보