Skip to content

Commit 4644877

Browse files
committed
systemd: don't use --pipe, --wait and --remain-after-exit together
fixes #236.
1 parent 692a87e commit 4644877

3 files changed

Lines changed: 36 additions & 27 deletions

File tree

lilac2/building.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -330,22 +330,18 @@ def _call_cmd_systemd(
330330
packager: str,
331331
) -> tuple[RUsage, bool]:
332332
'''run cmd with systemd-run and collect resource usage'''
333-
with logfile.open('wb') as logf:
334-
p = systemd.start_cmd(
335-
name,
336-
cmd,
337-
stdin = subprocess.PIPE,
338-
stdout = logf,
339-
stderr = logf,
340-
cwd = pkgdir,
341-
setenv = {
342-
'PATH': os.environ['PATH'], # we've updated our PATH
343-
'MAKEFLAGS': os.environ.get('MAKEFLAGS', ''),
344-
'PACKAGER': packager,
345-
},
346-
)
347-
p.stdin.write(input) # type: ignore
348-
p.stdin.close() # type: ignore
333+
systemd.start_cmd(
334+
name,
335+
cmd,
336+
input = input,
337+
logfile = logfile,
338+
cwd = pkgdir,
339+
setenv = {
340+
'PATH': os.environ['PATH'], # we've updated our PATH
341+
'MAKEFLAGS': os.environ.get('MAKEFLAGS', ''),
342+
'PACKAGER': packager,
343+
},
344+
)
349345

350346
return systemd.poll_rusage(name, deadline)
351347

lilac2/remote/runner.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import sys
22
import json
3-
import subprocess
43
import logging
54
import tempfile
65
import os
@@ -40,18 +39,15 @@ def main() -> None:
4039
if cores is not None:
4140
setenv['MAKEFLAGS'] = '-j{0}'.format(cores)
4241

43-
p = systemd.start_cmd(
42+
systemd.start_cmd(
4443
name,
4544
cmd,
46-
stdin = subprocess.PIPE,
4745
cwd = input.pop('pkgdir'),
4846
setenv = setenv,
47+
input = json.dumps(input).encode(),
4948
)
50-
p.stdin.write(json.dumps(input).encode()) # type: ignore
51-
p.stdin.close() # type: ignore
5249

5350
rusage, _ = systemd.poll_rusage(name, deadline, worker_no=worker_no)
54-
p.wait()
5551

5652
with open(resultpath, 'rb') as f:
5753
r = json.load(f)

lilac2/systemd.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import time
66
import logging
77
import threading
8+
import tempfile
89

9-
from .typing import Cmd, RUsage
10+
from .typing import Cmd, RUsage, PathLike
1011

1112
logger = logging.getLogger(__name__)
1213

@@ -92,24 +93,40 @@ def _read_service_int_properties(name: str, properties: dict[str, Optional[int]]
9293
def start_cmd(
9394
name: str, cmd: Cmd,
9495
setenv: dict[str, str] = {},
96+
input: bytes = b'',
97+
logfile: Optional[PathLike] = None,
9598
**kwargs: Any, # can't use P.kwargs here because there is no place for P.args
96-
) -> subprocess.Popen:
99+
) -> None:
100+
if logfile is None:
101+
pid = os.getpid()
102+
output = f'/proc/{pid}/fd/1'
103+
else:
104+
output = str(logfile)
105+
97106
# don't use --collect here because it will be immediately collected when
98107
# failed
99108
cmd_s: Cmd = [
100-
'systemd-run', '--pipe', '--quiet', '--user',
101-
'--wait', '--remain-after-exit', '-u', name,
109+
'systemd-run', '--quiet', '--user', '--remain-after-exit',
110+
'-u', name,
102111
'-p', 'CPUWeight=100', '-p', 'KillMode=process',
103112
'-p', 'KillSignal=INT',
113+
'-p', f'StandardOutput=append:{output}',
114+
'-p', f'StandardError=append:{output}',
104115
]
105116

106117
if cwd := kwargs.pop('cwd', None):
107118
cmd_s += [f'--working-directory={str(cwd)}'] # type: ignore
108119

120+
if input:
121+
fd, inputpath = tempfile.mkstemp(prefix='input-', suffix='.lilac')
122+
os.write(fd, input)
123+
os.close(fd)
124+
cmd_s += ['-p', f'StandardInput=file:{inputpath}'] # type: ignore
125+
109126
cmd_setenv = [f'--setenv={k}={v}' for k, v in setenv.items()]
110127
cmd_s = cmd_s + cmd_setenv + ['--'] + cmd # type: ignore
111128
logger.debug('running %s', subprocess.list2cmdline(cmd_s))
112-
return subprocess.Popen(cmd_s, **kwargs)
129+
subprocess.check_call(cmd_s, **kwargs)
113130

114131
def _get_service_info(name: str) -> tuple[int, str, str]:
115132
'''return pid and control group path'''

0 commit comments

Comments
 (0)