cgroups v2(통합) 계층 구조를 실행하는 컴퓨터가 있으므로 systemd는 모든 cgroup을 관리하고 systemd 사용자 인스턴스에 작업을 위임합니다. 나는 공연하고 싶다자원 통제일련의 프로세스에 적용되므로 이를 하나의 단위로 묶어야 합니다.시스템 전체.
일반적으로 systemd-run
이렇게 하면 됩니다. 하지만 불행하게도 이러한 프로세스는 이미 실행 중이므로 다시 시작하고 싶지 않습니다.
어떻게 만들 수 있나요?시스템 전체기존 프로세스에서? 이것컨트롤 그룹 인터페이스문서에는 이것이 가능하다고 나와 있지만 명령줄에서는 방법을 찾을 수 없습니다. 둘 다 이 일을 할 수 없을 systemctl
것 같습니다 .systemd-run
명령줄에서 방법이 있나요? 중요한 경우 systemd v241을 실행하고 있습니다.
답변1
dbus 호출을 위한 다양한 명령줄 도구가 있습니다. systemd에는 .라는 도구가 함께 제공되므로 명령줄에서 호출 busctl
할 수 있습니다 .StartTransientUnit
주문하다
구문은 정말 짜증나지만 다음과 같습니다(한 프로세스 ID의 경우 14460).
busctl call --user org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager StartTransientUnit 'ssa(sv)a(sa(sv))' \
'SCOPE-NAME.scope' fail 1 PIDs au 1 14460 0
설명하다
이것은 확실히 불투명합니다(제대로 만들기 위해 몇 번 시도한 후 어떻게 작동하는지 dbus-monitor
확인하기 위해 사용하게 되었습니다. 하지만 dbus를 통해서가 아닌 sysmanager에서만 사용되는 것 같습니다). 따라서 매개변수별로 설명하면 다음과 같습니다.systemd-run
systemd-run --user
busctl call --user # use user session dbus, not system
org.freedesktop.systemd1 # dbus service name
/org/freedesktop/systemd1 # dbus object in that service
org.freedesktop.systemd1.Manager # interface name in that service
StartTransientUnit # method we're going to call
'ssa(sv)a(sa(sv))' # signature of method, see below
'SCOPE-NAME.scope' # first argument, name of scope
fail # second argument, how to handle conflicts (see below)
1 # start of third argument, number of systemd properties for unit
PIDs # name of first property
au # data type of first property, (a)rray [aka list] of (u)nsigned integers
1 # count of array — that is, number of pids
14460 # first pid
0 # fourth argument: array size=0 (unused parameter)
명령에 추가
더 많은 숙소
장치에 다른 시스템 속성을 추가하려면 속성 수를 늘려 추가해야 합니다. 각 속성은 키, 값 유형, 값이라는 세 가지 이상의 추가 명령줄 매개 변수입니다. 예를 들어, Slice 속성을 추가하는 경우는 다음과 같습니다.
… fail 1 PIDs au 1 14460 0
도착하다
… fail 2 PIDs au 1 14460 Slice s whatever.slice 0
^ ^^^^^ ^ ^^^^^^^^^^^^^^
count key type value
"s" 유형은 문자열입니다. 해당 목록은 다음에서 찾을 수 있습니다.D-Bus 사양의 "유형 시스템" 장
물론 개수를 3으로 변경하고 세 번째 속성을 추가할 수도 있습니다. 등.
더 많은 PID
추가 속성과 유사하지만 이번에는 "PID" 속성 값에 숨겨진 개수입니다. 예를 들어보면 더 명확해질 것입니다.
… fail 1 PIDs au 1 14460 0
~이 되다
… fail 1 PIDs au 2 14460 14461 0
^ ^^^^^
internal count second pid
PID 14461과 14460을 추가하는 경우.
같은 방법으로 세 번째, 네 번째 등의 PID를 추가할 수 있습니다.
그것들을 결합하다
물론 다른 속성을 다른 PID와 결합할 수도 있습니다. pid 목록은 속성 값이므로 함께 보관해야 한다는 점을 기억하세요. pid 매개변수를 다른 속성과 혼합할 수 없습니다. 올바른 접근 방식은 다음을 변경하는 것입니다.
… fail 1 PIDs au 1 14460 0
도착하다:
… fail 2 PIDs au 2 14460 14461 Slice s whatever.slice 0
(순서는 중요하지 않습니다. PID 블록 앞에 Slice 블록을 넣을 수 있습니다.)
서명은 어디서 나오나요?
서명은 다음에서 얻을 수 있습니다.systemddbus API 문서또는 dbus 내부 검사를 사용하면 더 쉬울 수도 있습니다.
$ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager | grep1 StartTransientUnit
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.StartTransientUnit method ssa(sv)a(sa(sv)) o -
(에 대해서는 grep1
다음을 참조하세요.https://unix.stackexchange.com/a/279518)
여기에는 180개 이상의 다양한 메서드와 dbus 속성이 나열되어 있습니다. 그러니 생략하지 마세요 grep
.
갈등을 처리하는 데 “실패”한다는 것은 무엇을 의미합니까? 또 무엇이 있나요?
~에 따르면시스템 문서("CreateUnit" 아래 참조) 유용한 값은 fail
및 입니다 replace
. fail
즉, 충돌이 있으면 범위가 시작되지 않습니다. replace
systemd가 충돌하는 단위를 제거한다는 의미입니다. 이는 현재 실행 중이거나 예약된 장치("대기 중"이라고 표시됨)에만 적용되는 것으로 보입니다. 예를 들어 교체는 이미 실행 중인 범위를 동일한 이름으로 대체하지 않습니다.