我经常发出需要一些时间的命令。例如,使用控制台下载应用程序下载某些内容。如果我想在命令完成时收到通知,我通常会执行以下操作:
$ <do something>; echo '<do something> has finished' | osd_cat
然后我可以切换到另一个窗口并同时执行其他操作。完成后,我会收到通知。
现在我的问题是我很懒。哦,好吧。我只是不想每次都输入这些。所以我想知道是否有一个守护进程可以监视正在运行的进程并在进程完成时触发一些操作。
我想要配置选项以便我可以控制:
过滤要监视的进程(例如,监视至少运行一分钟的进程)
自定义进程完成时执行的命令
答案1
您可以尝试使用 Bash 的“wait”命令来编写一个小包装脚本,如下所示:
#!/bin/bash
command=$*
$command &
wait
osd_cat "$command has finished"
wait 命令会导致脚本暂停,直到所有子进程都返回退出代码。您还可以添加一点超时,以确保不会等待太久
答案2
用一个简单的 shell 脚本来为你执行长命令怎么样?可能是这样的:
#!/bin/sh
# tellme: run a command and tell me when it's done
if [ $# -gt 0 ]; then
if $*; then
echo "'$*' has finished" | osd_cat
else
echo "'$*' has finished with errors" | osd_cat
fi
else
echo "usage: $0 <command>"
fi
然后,您只需运行以下命令:
tellme <do something>
当然,它不是一个守护进程,所以我不认为它会帮助你在后台启动(例如从 cron),但它应该可以完成交互式命令的工作。
答案3
也许它不是一个守护进程,但它对我来说具有相同的用途。zsh
在执行任何命令之前和之后立即执行可编写脚本的钩子。您可以让它们测量挂钟时间并运行任何操作(此处:),notify-send
如果最后执行的命令足够长。以下摘录自我的~/.zshrc
:
preexec () {
ZSH_CMD_START_TIME="$(date +%s)"
ZSH_CMD_NAME="$1"
}
precmd () {
[[ -n "$ZSH_CMD_NAME" ]] && {
ZSH_LAST_TIME=$(($(date +%s) - $ZSH_CMD_START_TIME))
[[ $ZSH_LAST_TIME -gt 60 ]] && [[ -n "$DISPLAY" ]] && { which >/dev/null notify-send } && {
notify-send --urgency=low --category=zsh --expire-time 1500 "ZSH:" '`'"$ZSH_CMD_NAME"'`'" took $ZSH_LAST_TIME seconds."
}
ZSH_CMD_NAME=
}
}