永远运行sudo命令

时间:2016-05-11 22:41:42

标签: node.js azure ubuntu npm forever

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

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

当我运行此命令时,我的网络应用程序已成功启动 - 请注意,如果我在没有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时,它也不起作用。另外,我尝试将此行添加到/etc/init/myapp.conf中的Ubuntu文件中,以尝试在启动时启动该进程:

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\" ./"

这也不起作用。

在<{1}}命令中写出server.js文件而不是npm run start-prod也是的选项,因为我在better-npm-run中使用{{3}}我的forever文件启动服务器 - 又名:我必须使用package.jsonnpm run start-prod启动网络应用。

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

谢谢

1 个答案:

答案 0 :(得分:2)

正如@marekful所说,解决方案是通过命令/etc/sudoerssudo visudo中添加一行,以允许在不使用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
  

注意:为什么我需要为sudo添加apt-get?它对apt-get很有用。

所以我认为您可以尝试为所需的命令sudo添加一行,例如node等。

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