그래서 시스템 서비스 파일을 작성했습니다.만자로 리눅스두 개의 셸 명령을 실행하여 런타임 시 일부 커널 매개변수를 설정하여 사용자 정의 절전 작업을 활성화합니다.
참고: 이것은 독일 컴퓨터 잡지에서 나온 팁입니다. 원래는 쉘 명령을 file 에 넣기로 되어 있었지만 /etc/rc.local
systemd 서비스를 사용하여 만들려고 했습니다. 더 이상 사용되지 않는 것으로 간주 되므로 rc.local
새로운 것을 배우고 싶습니다.
아래에서 내 서비스 파일이 /etc/systemd/system/power-savings.service
. 명령어 가 2개라서 ExecStart
선택했어요 Type=oneshot
.
[Unit]
Description=Enable custom power saving actions provided by c't magazine
# Quelle(n): c't 25/2016, S. 77
# c't 26/2016, S. 12
[Service]
Type=oneshot
# SATA Link Power Management aktivieren
ExecStart=/usr/bin/sh -c 'for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done'
# Energieverwaltung für den Audiocodec aktivieren
ExecStart=/usr/bin/sh -c 'echo 1 > /sys/module/snd_hda_intel/parameters/power_save'
[Install]
WantedBy=multi-user.target
다음을 통해 서비스 파일을 확인했습니다.
$ sudo systemd-analyze verify /etc/systemd/system/power-savings.service
그런 다음 다음 명령을 사용하여 데몬을 다시 로드했습니다.
$ sudo systemctl daemon-reload
나는 그것을 활성화합니다 :
$ sudo systemctl enable power-savings.service
그런 다음 서비스를 실행합니다.
$ sudo systemctl start power-savings.service
효과가 있었어요! 커널 매개변수가 설정되었습니다.
그러나 시스템을 다시 시작한 후에도 서비스가 적용되지 않는 것 같습니다. 서비스 상태는 성공으로 표시되지만...
$ systemctl status power-savings.service
Process: 412 ExecStart=/usr/bin/bash -c echo 1 > /sys/module/snd_hda_intel/parameters/power_save (code=exited, status=0/SUCCESS)
Process: 404 ExecStart=/usr/bin/bash -c for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done (code=exited, status=0/SUCCESS)
Main PID: 412 (code=exited, status=0/SUCCESS)
그러나 커널 매개변수는 설정되지 않았습니다. 따라서 내 서비스는 사용자 세션 중에만 작동합니다. 안타깝게도 시스템 시작 중에는 제대로 작동하지 않습니다.
제가 놓친 부분이 있나요? 이 중 일부 After
나 지침 이 필요 합니까 Require
? ExecStart
명령어에 실제로 무슨 일이 일어나고 있는지 디버깅하려면 어떻게 해야 합니까 ?
답변1
내 문제에 대해 더 자세히 조사하는 동안 Arch Linux 커뮤니티에서 흥미로운 진술을 발견했습니다. 존재하다이 게시물사용자칼슨 65저와 비슷한 일을 하려고 노력 중입니다.
토론이 나를 다음으로 리디렉션합니다.기사이에 관해 tmpfiles.d
가능한 해결책은 파이프나 리디렉션을 사용하는 대신 파일에 값을 쓰는 것입니다. 그런데 이 글에서 재미있는 점이 하나 있습니다노트:
/sys
이 방법은 다음과 같은 이유로 옵션을 설정할 수 없습니다 .systemd-tmp파일-설정적절한 장치 모듈이 로드되기 전에 서비스를 실행할 수 있습니다.
우리 프로젝트의 공통점은 둘 다 /sys/...
시스템 시작 중에 작성을 시도한다는 것입니다. 이 사실은 왜 작동하지 않는지에 대한 질문에 대한 답이 될 수 있습니다.
답변2
귀하의 답변에 있는 정보를 바탕으로, 귀하의 문제를 해결하기 위해 제가 아는 가장 정확한 방법은 모듈이 설정된 시스템 시작 순서의 어느 단계에 있는지 파악하는 것입니다 /sys
.
이를 알고 나면 After=<whatever>.target
사용자 정의 서비스 파일에 지시문을 추가하여 전제 조건 단계가 완료될 때까지 systemd가 서비스를 시작하지 않도록 할 수 있습니다.
모듈이 구체적으로 포함된 대상을 추적할 수 없는 경우 /sys
시작 중에 서비스가 상대적으로 늦게 로드되도록 하는 원인을 항상 추측할 수 있습니다 After=local-fs.target
. 이것은 아니다최대올바른 접근 방식이지만 "주문 주기"를 도입하지 않도록 주의하는 한 아마도 잘 작동할 것입니다.