【问题标题】:console kill command does not work on Ubuntu控制台 kill 命令在 Ubuntu 上不起作用
【发布时间】:2018-03-14 03:54:27
【问题描述】:

您好,我的 Nodejs 应用程序上有这个命令,它会找到一个带有修剪名称的进程并将其杀死。

let killTrim = () => {
  console.log('kill "$(pgrep -f ' + trimName + '.mp4)"')
  cmd.run('kill "$(pgrep -f ' + trimName + '.mp4)"')
  trimName = null
}

这在我的计算机上的本地主机上工作得很好,但在我的服务器上不起作用(ubuntu 16.04)。输出控制台日志,但 cmd.run 命令不在服务器上运行。当我在服务器上手动输入 'kill "$(pgrep -f moo.mp4)"' 时,它将运行并终止进程。

我已经对此问题进行了一些研究,但我无法找到任何类似的问题。

【问题讨论】:

  • 检查服务器权限
  • 你确定你的node应用和进程在同一个用户下运行吗?
  • 能否将cmd.run(...) 替换为cmd.get(...,(err,data,std)=>{console.log('err',err);console.log('out',data);console.log('stderr',std);}) 并显示结果?
  • @VasylMoskalov 这里是结果pastebin.com/xSZWgh04
  • 我编辑了我的答案。试试看

标签: javascript node.js ubuntu


【解决方案1】:

我会使用下面这样简单的东西

cmd = require('node-cmd');
cmd.get('pgrep -f node | xargs kill', (err, data, stderr) => {
  console.log(err, data, stderr);
});

即使你有多个进程运行它也能工作

【讨论】:

    【解决方案2】:

    我查看了您的粘贴箱。看起来 pgrep -f ... 返回多个 pid。所以试试这个:

    cmd.run('for a in $(pgrep -f '+trimName+'.mp4); do kill $a; done');
    

    【讨论】:

    • 不幸的是这不起作用,进程仍然没有被杀死
    • 抱歉,回复晚了,我丢了工作。该解决方案有效,问题如您所说,多个 pid
    【解决方案3】:

    似乎是您的节点应用程序没有足够的权限来终止该进程。您可以尝试以下方法:

    sudo node app.js 
    

    【讨论】:

    • 其实试过了,也在sudo pm2 start app.js上跑过还是不行
    • 您可以尝试在 kill "$(pgrep -f $1)" 中创建 bash 脚本,例如在 this question 中,然后从 nodejs 执行它
    • 问题在于进程的名称是动态的
    • 您可以pass arguments to bash script 并使用$@ 在脚本中获取它们。
    猜你喜欢
    • 2016-09-25
    • 2015-10-16
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2023-01-12
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多