Skip to content

Job: Output lost if program being run was installed via 'snap'. #672

@zelch

Description

@zelch

This was a weird one to try and debug, reproduction requires a Linux system with snap installed, which likely means some Debian derived distribution.

To most easily reproduce, install jq via apt, and yq via snap, save the following as something like /tmp/snap_output_lost.lua, and in neovim run something like :=luafile /tmp/snap_output_lost.lua:

local ok, j = pcall(function()
  return require("plenary.job"):new({
    command = "jq",
    args = { "--version" },
    on_exit = vim.schedule_wrap(function(j, code)
      vim.notify("jq j.result: " .. vim.inspect(j:result()))
    end),
  })
end)
vim.notify("jq ok: " .. vim.inspect(ok))
local spawn_ok, err = pcall(j.start, j)
vim.notify("jq spawn_ok: " .. vim.inspect(spawn_ok) .. ", err: " .. vim.inspect(err))

local ok, j = pcall(function()
  return require("plenary.job"):new({
    command = "yq",
    args = { "--version" },
    on_exit = vim.schedule_wrap(function(j, code)
      vim.notify("yq j.result: " .. vim.inspect(j:result()))
    end),
  })
end)
vim.notify("yq ok: " .. vim.inspect(ok))
local spawn_ok, err = pcall(j.start, j)
vim.notify("yq spawn_ok: " .. vim.inspect(spawn_ok) .. ", err: " .. vim.inspect(err))

On my system, the output from jq is printed, and the output from yq is lost.

Which leads to the next question: Why?

(This took a bit to figure out.)

If you run some long running program installed via snap, launch it with the above, and look at /proc/<pid>/fd/[012], you'll find that they are all sockets.

I'm not yet sure why that matters, but a script that redirects everything to force stdout and stderr to be pipes instead of sockets seems to work for me:

#!/bin/bash

yq "$@" > >(cat) 2> >(cat >&2)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions