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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions