Ubuntu - 已删除的服务仍然有效

Ubuntu - 已删除的服务仍然有效

我为我的远程笔记本电脑创建了一个 .sh 文件,该文件会在电源插头断开时播放警报文件ffplay并向我发送电报消息。当我在终端中运行该文件时,它运行良好,因此我认为只需为其创建一个服务即可。

已关注教程使其工作,但发现当将其用作服务时音频文件不再播放,所以我决定删除我关注的服务本教程

当我使用该文件检查服务时,$ systemctl status battery_alarm.service已经找不到它了,所以我认为一切都已完成,但即使重新启动笔记本电脑、更新和升级后,它仍然在某处运行。

这没什么大不了的,因为我仍然能收到 Telegram 消息,但我想解开这个谜团,找出我需要删除什么以及在哪里删除才能停止这种情况。有什么建议给这个菜鸟吗?:-)

编辑:用于该服务的.sh 文件是:

#! /bin/bash
echo "monitoring"
power=$(cat /sys/class/power_supply/BAT0/status)
# Set the API token and chat ID
API_TOKEN="<removed for obvious reasons :-)>"
CHAT_ID="1234567890"

# Set the message text
MESSAGE="HP Victus Unplugged"


while true; do
  actual=$(cat /sys/class/power_supply/BAT0/status)
  # echo $actual
  if [ $actual != $power ]; then
     power=$actual
     echo $actual
  fi
  if [ $actual == "Discharging" ]; then
     echo "discharging"
     # Use the curl command to send the message
     curl -s -X POST https://api.telegram.org/bot$API_TOKEN/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
     amixer -D pulse sset Master 100%
     ffplay -autoexit -nodisp critical.mp3
  fi

  sleep 10
done

音频文件链接对于那些想要获得副本的人

编辑:在我更改 checkpower.sh 文件中的消息后,我现在收到 2 条不同的消息。修改后的 checkpower.sh 中的新消息包含状态和电池百分比,以及我以前收到的旧消息。因此,似乎在我创建服务时,创建了 checkpower.sh 文件的副本,该文件仍在某处运行。一条通知我的消息对我来说就足够了。有什么想法可以找到这个不需要的服务并终止它吗?

编辑:我尝试了 forkit 方法,它给了我执行行的 pid

15:52:07 exec   112099                 cat /sys/class/power_supply/BAT0/status
15:52:07 exec   112100                 curl -s -X POST https://api.telegram.org/bot
15:52:07 exec   112102                 amixer -D pulse sset Master 100%
15:52:07 exec   112104                 ffplay -autoexit -nodisp critical.mp3
15:52:07 exec   112108                 sleep 10

我尝试这些 pid 时得到的输出是:

(base) qwerty@qwerty-Victus:~$ systemctl status 112099
Failed to get unit for PID 112099: PID 112099 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status 112100
Failed to get unit for PID 112100: PID 112100 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status 112102
Failed to get unit for PID 112102: PID 112102 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status 112104
Failed to get unit for PID 112104: PID 112104 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status 112108
Failed to get unit for PID 112108: PID 112108 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status --user 112099
Failed to get unit for PID 112099: PID 112099 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status --user 112100
Failed to get unit for PID 112100: PID 112100 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status --user 112102
Failed to get unit for PID 112102: PID 112102 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status --user 112104
Failed to get unit for PID 112104: PID 112104 does not belong to any loaded unit.
(base) qwerty@qwerty-Victus:~$ systemctl status --user 112108
Failed to get unit for PID 112108: PID 112108 does not belong to any loaded unit.

答案1

知道如何找到这个不需要的服务并将其终止吗?

一些:

  1. 您的主循环以为中心sleep,因此运行pgrep sleep并使用找到的 PID 来检查它可能在哪个服务中运行 - 使用systemctl status [--user] <pid>(使用--user 选项和不带选项,无论哪个都返回更准确的结果)。

    或者,运行systemd-cglssystemctl status没有我们可以使用以下命令将 cgroup 重命名为服务名称(即服务名称),并逐个查看所有 cgroup,寻找同时具有bashsleep进程的 cgroup。

    这两种方法都可以让您追踪该进程到系统服务、用户级服务(通过 进行管理systemctl --user)、cron 作业或类似服务。

  2. 您的脚本调用外部可执行文件,因此使用forkstat或 bpftraceexecsnoop.bt来确定哪个进程启动了 curl 或 amixer。(以 root 身份运行 forkstat,然后拔掉电源并等待脚本触发通知,查找提及“curl”的“exec”行;您的脚本的 PID 将位于上面两行的“fork ... parent”事件中。)

    一旦您知道了 PID,请参阅上面#1 中的说明。

建议编写更好的脚本:不要每 10 秒检查一次,而是让脚本由事件触发。acpid守护进程已经为此目的而存在 - 它将针对指定的 ACPI 事件(包括电池插入/拔出)运行指定的脚本。

相关内容