【问题标题】:Closing the terminal should kill the associated process with the terminal关闭终端应该杀死与终端关联的进程
【发布时间】:2017-01-05 13:54:16
【问题描述】:

我已经打包了我们软件的 Debian 文件。现在需要启动一个.sh 脚本来运行程序/软件。这个.sh 脚本实际上运行了一个 Django 服务器和其他一些服务。

要真正启动这个应用程序,我们需要运行菜单中的.desktop 文件。菜单中的这个.desktop 文件与上面提到的.sh 脚本相关联。这会提示终端并要求输入密码。一旦给出密码,这将启动服务并且终端保持活动状态。

要彻底关闭这个服务,我们需要通过找到进程的PID,从终端杀掉它来杀掉进程。但是现在我想在关闭终端时终止这个进程。

我该怎么做?

【问题讨论】:

  • 您是从桌面图标启动服务器吗?我宁愿检查systemd.unit 以获取启动守护程序的一种(几种)正确方法。

标签: linux shell scripting debian deb


【解决方案1】:

如果您尝试创建服务(一些在后台运行的程序),您应该使用系统的机制来创建。 传统的方法是使用/etc/init.d/ 中的脚本,更现代的方法是使用systemd

例如一个文件/etc/systemd/system/myservice.system

[Unit]
Description=My Service

[Service]
Type=simple

# you could run the service as a special user
#User=specialuser
WorkingDirectory=/var/lib/myservice/
# execute this before starting the actual script
#ExecStartPre=/usr/lib/myservice/bin/prestart.sh
ExecStart=/usr/bin/myservice
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后您可以使用以下命令启动/停止服务(以 root 身份):

 systemctl start myservice

分别

 systemctl stop myservice

你可以有服务的依赖链,所以启动myservice会自动启动myhelper1myhelper2

查看手册页systemd.unit.5

【讨论】:

    【解决方案2】:

    当控制终端关闭时,前台进程组应该收到SIGHUP 信号。如果您的目标进程已经预计在前台,那么它可能正在捕获或忽略SIGHUP(接收该信号的进程的默认行为是终止)。

    【讨论】:

    • @paul 感谢您的回答,我实际上没有给出我的 deb 安装包的任何路径,所以我所有的主要软件目录和文件都在根文件夹中,我的应用程序启动脚本也在根目录中,所以是否就像程序/脚本与根相关联时忽略了叹息?因为今天我将我的软件重新打包到一个 deb 安装程序中,并且我将安装路径设置为 /usr/share,在此之后,当我再次安装 deb 时,我的所有主要软件文件现在都存储在 /usr/share 中,当我关闭终端进程也自动被杀死
    • 没有。找到二进制文件的目录对信号处理没有影响。
    • Paul 但现在出现了新问题,即当我尝试使用其他非 root 用户安装 deb 时,当我单击 deb 时,软件安装程序启动,然后在一段时间后提示对于管理员密码,并警告“要安装此软件,您将需要管理访问权限”,但即使在正确提供密码后,软件安装程序也会自动关闭而不安装软件,您能帮我解决这个问题吗??
    • 如果您需要问其他问题,您应该开始一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2018-11-26
    • 2020-08-16
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多