execCmds method
Executes a command list in a WSL distro
Implementation
Future<List<int>> execCmds(
String distribution,
List<String> cmds, {
String? user,
required Function(String) onMsg,
required Function onDone,
bool showOutput = true,
}) async {
List<int> processes = [];
Process result = await Process.start(
'wsl', ['-d', distribution, '-u', user ?? 'root'],
mode: ProcessStartMode.normal, runInShell: true);
Timer currentWaiter = Timer(const Duration(seconds: 60), () {
result.kill();
onDone();
});
result.stdout
.cast<List<int>>()
.transform(const Utf8Decoder())
.listen((String line) {
resultQueue.add(line);
onMsg(line);
currentWaiter.cancel();
// No new output within the last 30 seconds
currentWaiter = Timer(const Duration(seconds: 15), () {
result.kill();
onDone();
});
});
// Log output to file
result.stdin.writeln('script -B /tmp/currentsessionlog -f');
// Start windows with output
await Process.start(
'wsl',
[
'-d',
distribution,
'-u',
user ?? 'root',
'tail',
'-n',
'+1',
'-f',
'/tmp/currentsessionlog'
],
mode: showOutput ? ProcessStartMode.detached : ProcessStartMode.normal,
runInShell: true);
// Delay to allow tail to start
await Future.delayed(const Duration(milliseconds: 500));
for (var cmd in cmds) {
result.stdin.writeln(cmd);
}
return processes;
}