我经常发布需要一些时间的命令。 例如使用控制台下载应用程序下载的东西。 如果我想在命令完成时被注意到,我通常会这样做:
$ <do something>; echo '<do something> has finished' | osd_cat
然后,我可以切换到另一个窗口,同时做其他的事情。 完成后,我会注意到。
现在我的问题是我很懒 。 好吧。 我只是不想每次input这个。 所以我想知道是否有一个守护进程可以监视正在运行的进程,并在进程结束时触发一些操作。
我想configuration选项,所以我可以控制:
过滤要观看的进程(例如,运行至less一分钟的进程进程)
定制进程完成时要执行的命令
你可以尝试使用Bash的“等待”命令来写一个小包装脚本就像:
#!/bin/bash command=$* $command & wait osd_cat "$command has finished"
wait命令会导致脚本暂停,直到所有subprocess都返回一个退出代码。 您还可以添加一点暂停,以确保您不会等待太久
怎么样只是一个简单的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),但是它应该为交互式命令做好准备。
也许这不是一个守护进程,但它对我来说也是一样的。 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= } }