为什么我的进程在注销时终止,尽管 nohup 和 disown ?

为什么我的进程在注销时终止,尽管 nohup 和 disown ?

我有一个可执行文件(用 Unity 制作的服务器),我想在注销后继续运行。所有的互联网都说我应该能够通过nohupdisown/或两者来完成此任务。但这不起作用。我愿意:

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

现在你有两种可能性。

  1. 可执行文件应在系统启动时启动。那么你必须发出sudo systemctl enable myexecutable.service
  2. 您想手动启动它。然后发出sudo systemctl start myexecutable.service

在第一种情况下,您可能必须另外发出“systemctl start”命令来测试它,因为“启用”并不意味着“启动”

即使您离开会话,该服务也会运行。如果该可执行文件有一些输出(在 bash 文件中使用“logger”),您可以随时使用journalctl -u myexecutable.service

相关内容