【问题标题】:running sudo command with forever永远运行 sudo 命令
【发布时间】:2016-09-07 13:16:09
【问题描述】:

我有以下命令用于启动我的 Node.js 网络应用程序:

sudo node /home/azureuser/myapp/node_modules/concurrently/src/main.js --kill-others "npm run start-prod" "npm run start-prod-api"

当我运行此命令时,我的 Web 应用程序已成功启动 - 请注意,如果我在没有 sudo 前缀的情况下运行它,它确实不会启动,因为它必须启动在端口 80 上运行的进程. 但是,我想使用forever 不断地运行我的网络应用程序。我试过从 app 目录运行它:

sudo forever -c "node /home/azureuser/myapp/node_modules/concurrently/src/main.js --kill-others \"npm run start-prod\" \"npm run start-prod-api\"" -l forever.log -o out.log -e err.log -a --minUptime 20000 --spinSleepTime 5000 --uid "production" ./

当我尝试这个时,我收到以下错误:

Error: spawn EACCES
  at exports._errnoException (util.js:870:11)
  at ChildProcess.spawn (internal/child_process.js:298:11)
  at Object.exports.spawn (child_process.js:362:9)
  at spawn (/home/azureuser/myapp/node_modules/concurrently/node_modules/cross-spawn/index.js:87:19)
  at /home/azureuser/myapp/node_modules/concurrently/src/main.js:109:21
  at arrayMap (/home/azureuser/myapp/node_modules/concurrently/node_modules/lodash/index.js:1377:25)
  at Function.map (/home/azureuser/myapp/node_modules/concurrently/node_modules/lodash/index.js:5891:14)
  at run (/home/azureuser/myapp/node_modules/concurrently/src/main.js:105:22)
  at main (/home/azureuser/myapp/node_modules/concurrently/src/main.js:37:5)
  at Object.<anonymous> (/home/azureuser/myapp/node_modules/concurrently/src/main.js:306:1)
  at Module._compile (module.js:409:26)
  at Object.Module._extensions..js (module.js:416:10)
  at Module.load (module.js:343:32)
  at Function.Module._load (module.js:300:12)
  at Function.Module.runMain (module.js:441:10)
  at startup (node.js:134:18)
error: Forever detected script exited with code: 1

当我尝试在 -c 命令中添加 sudo 时,它也不起作用。此外,我尝试将此行添加到Ubuntu 中的/etc/init/myapp.conf 文件中,以尝试在启动时启动该过程:

su - azureuser -c "forever -c \"node /home/azureuser/myapp/node_modules/concurrently/src/main.js --kill-others \\\"npm run start-prod\\\" \\\"npm run start-prod-api\\\"\" -l forever.log -o out.log -e err.log -a --minUptime 20000 --spinSleepTime 5000 --uid \"production\" ./"

这也不起作用。

这也是不是forever 命令中写出server.js 文件而不是npm run start-prod 的选项,因为我在package.json 文件中使用better-npm-run 来启动服务器——又名:我必须使用 npm run start-prodnpm run start-prod-api 启动网络应用程序。

我做错了什么?如何以管理员权限运行此进程(以便它可以在端口 80 上运行)并且仍然可以永久使用?

谢谢

【问题讨论】:

  • 阅读sudoers 文件。您可以添加一个规则,允许该特定 Linux 用户以 root(或任何其他用户)身份运行该特定命令,而无需输入密码。 askubuntu.com/questions/159007/…
  • @marekful 感谢您的回复。我需要将哪个命令添加到sudoers 文件中? forever?或者better-npm-run 这样使用端口 80 不成问题?
  • @marekful 我尝试将foreverbetter-npm-runconcurrently 添加到sudoers 文件中,但是我仍然收到Error: spawn EACCES 错误。

标签: node.js azure ubuntu npm forever


【解决方案1】:

正如@marekful 所说,解决方案是通过命令sudo visudo/etc/sudoers 中添加一行,以允许在不使用sudo 的情况下执行。

还有一个有用的页面https://askubuntu.com/questions/72267/how-to-allow-execution-without-using-the-sudo,您可以参考。

我尝试创建并运行一个shell脚本文件测试成功,请看下面的步骤。

~ $ touch cmd.sh
~ $ chmod +x cmd.sh
~ $ vim cmd.sh # Adding the content below, testing for using `apt-get update`

#!/bin/sh
sudo apt-get update

~ $ sudo visudo # Adding a line with the content `<my-user> ALL=NOPASSWD: /usr/bin/apt-get` at the end of the `sudoers` file; find the path of `apt-get` using `which apt-get`
~ $ ./cmd.sh # it works fine without using password

注意:为什么我需要为apt-get添加sudo?这是apt-get 的特别之处。

所以我觉得你可以尝试为需要的命令添加一行sudo,比如node

如有任何疑问,请随时告诉我。

【讨论】:

  • @peter-pan-msft 感谢您的回复!我按照您的建议使用sudo visudo 添加了npmnode 的行。然后我尝试了这个命令:sudo forever -l forever.log -o out.log -e err.log -a --minUptime 20000 --spinSleepTime 5000 --uid "production" start -c "sudo npm run start" /home/azureuser/myapp/,虽然我认为这是正确的方法,但我仍然收到这个错误:/home/azureuser/myapp/:26533 - npm ERR! argv "/opt/bitnami/nodejs/bin/.node.bin" "/opt/bitnami/nodejs/bin/npm" "run" "start" "/home/azureuser/myapp/"。显然它将脚本名称 (/home/azureuser/myapp/) 视为 arg。
  • @UnknownUser 我认为这个问题可能是由于当前路径没有packages.json 来运行npm run start,而sudonpm 是不必要的。同时,我建议您可以逐步手动测试这些命令,以确定哪个命令需要root权限。
  • 脚本名称确实是程序node的参数。在suders 文件中,必须给出完整的确切命令(连同所有参数),或者您也可以使用正则表达式。因此,在您的情况下,在 ALL=NOPASSWD: 之后,您必须提供带有参数的完整命令行。 sudo 仅在完全匹配时才允许它在没有密码的情况下运行,即使是空格差异也会使其失败。
  • @PeterPan-MSFT 是的,这让我可以将sudo 与我的npm 命令一起使用。谢谢!