我为我的远程笔记本电脑创建了一个 .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
知道如何找到这个不需要的服务并将其终止吗?
一些:
您的主循环以为中心
sleep
,因此运行pgrep sleep
并使用找到的 PID 来检查它可能在哪个服务中运行 - 使用systemctl status [--user] <pid>
(使用--user 选项和不带选项,无论哪个都返回更准确的结果)。或者,运行
systemd-cgls
或systemctl status
(没有我们可以使用以下命令将 cgroup 重命名为服务名称(即服务名称),并逐个查看所有 cgroup,寻找同时具有bash
和sleep
进程的 cgroup。这两种方法都可以让您追踪该进程到系统服务、用户级服务(通过 进行管理
systemctl --user
)、cron 作业或类似服务。您的脚本调用外部可执行文件,因此使用
forkstat
或 bpftraceexecsnoop.bt
来确定哪个进程启动了 curl 或 amixer。(以 root 身份运行 forkstat,然后拔掉电源并等待脚本触发通知,查找提及“curl”的“exec”行;您的脚本的 PID 将位于上面两行的“fork ... parent”事件中。)一旦您知道了 PID,请参阅上面#1 中的说明。
建议编写更好的脚本:不要每 10 秒检查一次,而是让脚本由事件触发。acpid
守护进程已经为此目的而存在 - 它将针对指定的 ACPI 事件(包括电池插入/拔出)运行指定的脚本。