我有一个可执行文件(用 Unity 制作的服务器),我想在注销后继续运行。所有的互联网都说我应该能够通过nohup
或disown
/或两者来完成此任务。但这不起作用。我愿意:
nohup /usr/bin/myexecutable &
disown -h
此时检查进程列表,我的进程正在运行。然后我exit
和 ssh 重新登录,再次检查进程列表,它消失了。我已经尝试过使用和不使用disown
、使用和不使用-h
标志等,但是当我退出外壳程序时,没有什么可以阻止进程消失。
我可以使用screen
或来完成此操作tmux
,但我正在尝试设置一个简单的启动脚本,工作人员中的非技术人员只需登录并运行即可。有任何想法吗?
(我运行的是 Ubuntu 16.04.6 LTS。)
编辑:有人建议这个问题,但就像@mathsyouth 的评论一样,disown
对我不起作用。 @Fox,这个问题的唯一答案的作者,说“如果你正在使用的程序仍然在 shell 退出时死掉并被拒绝,那么这是一个不同的问题。”所以看来这是一个不同的问题。 (如上所述,他的使用建议screen
对我的用例没有帮助。)
答案1
由于 tmux 或 screen 不是选项,我建议您使用 systemd。对于您的示例,您将使用您最喜欢的编辑器(nano、vim 等)创建一个文件(如 sudo),例如:
sudo nano /etc/systemd/system/myexecuteable.service
它至少应包含以下内容:
[Unit]
Description=start my executable after multi-user target
[Service]
Type=simple
ExecStart=/path/to/my/executable
[Install]
WantedBy=multi-user.target
现在你有两种可能性。
- 可执行文件应在系统启动时启动。那么你必须发出
sudo systemctl enable myexecutable.service
- 您想手动启动它。然后发出
sudo systemctl start myexecutable.service
在第一种情况下,您可能必须另外发出“systemctl start”命令来测试它,因为“启用”并不意味着“启动”
即使您离开会话,该服务也会运行。如果该可执行文件有一些输出(在 bash 文件中使用“logger”),您可以随时使用journalctl -u myexecutable.service