无法以编程方式将tmate作为守护程序运行

时间:2019-02-22 15:08:19

标签: node.js

我有一个以sudo运行的应用程序,它是使用pm2启动的。它必须以sudo运行。

在其中,我在启动时运行此功能:

const util = require('util');
const exec = util.promisify(require('child_process').exec);
function getTmate(app) {
  exec('rm /tmp/tmate.sock display -p \'#{tmate_ssh}\'').catch(err => console.log(err));
  exec('tmate -S /tmp/tmate.sock display -p \'#{tmate_ssh}\'').catch(err => console.log(err)); //exception here
  setTimeout(async function () {
    let {stdout} = await exec('tmate -S /tmp/tmate.sock display -p \'#{tmate_ssh}\'').catch(err => console.log(err));
    if (stdout.length > 8) {
      console.log(stdout);
    }
    else {
      getTmate();
    }
  }, 15000);
}

但是我永远无法正确开始tmate。在第二个exec上,我收到以下错误:

  

无法连接到服务器

at ChildProcess.exithandler (child_process.js:297:12)
at ChildProcess.emit (events.js:197:13)
at maybeClose (internal/child_process.js:984:16)
at Socket.stream.socket.on (internal/child_process.js:401:11)
at Socket.emit (events.js:197:13)
at Pipe._handle.close (net.js:611:12)   killed: false,   code: 1,   signal: null,   cmd:    "tmate -S /tmp/tmate.sock > display -p '#{tmate_ssh}'",   stdout: '',   stderr: 'failed to connect  to server\n' }

这个想法是在启动时运行tmate并将ssh尽快发送到我的云服务器。任何其他方法都欢迎。还尝试在tmate -S /tmp/tmate.sock new-session -d上运行/etc/rc.local,但稍后无法检索ssh字符串(相同的错误)

如果我在终端中运行以下命令,tmate会正常工作:

tmate -S /tmp/tmate.sock new-session -d

tmate -S /tmp/tmate.sock display -p '#{tmate_ssh}'

1 个答案:

答案 0 :(得分:0)

采用了另一种有效的方法:

将/etc/rc.local更改为以下内容:

su nvidia -c 'tmate -S /tmp/tmate.sock new-session -d'
su nvidia -c 'tmate -S /tmp/tmate.sock wait tmate-ready'
su nvidia -c "tmate -S /tmp/tmate.sock display -p '#{tmate_ssh}'  > /tmp/tmateSSH"
exit 0

后来,我刚刚检索了/ tmp / tmateSSH(如果可用)。