我有以下命令用于启动我的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.json
和npm run start-prod
启动网络应用。
我做错了什么?如何以管理员权限运行此进程(因此它可以在端口80上运行)并且仍然可以永久使用?
谢谢
答案 0 :(得分:2)
正如@marekful所说,解决方案是通过命令/etc/sudoers
在sudo 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
等。
如有任何疑虑,请随时告诉我。