pnj*_*pnj 4 terminal notifications emacs iterm2 macos
我正在远程 shell 上运行一个很长的进程。我想在流程完成时触发通知。这个答案还不够,因为长命令在远程服务器上,所以它不能调用终端通知程序。
我可以通过使用 iTerm2 触发器来接近我想要的结果。例如,如果我在远程服务器上运行以下命令并为 __FINISHED__ 设置 iTerm2 触发器:
./long_process && echo "\__FINISHED__"
Run Code Online (Sandbox Code Playgroud)
这具有不受欢迎的功能,每次我在编辑器或代码(我在 emacs shell 中运行代码)中回滚到此命令时,都会触发通知。
一种解决方案可能是 iTerm2 会识别的某种文本通知,但不会出现在 emacs 回滚缓冲区中。
您还没有指定您想要什么样的通知,也没有指定远程服务器正在运行什么操作系统,所以我将不得不在这里做一些假设。我假设您并不真正关心它是什么类型的通知,只要您收到通知并且远程服务器正在运行某种 *nix 风格。
给自己发一封电子邮件。如果sendmail
在服务器上配置,你可以做
./long_process && echo "Job done" | sendmail pnj@yourdomain.com
Run Code Online (Sandbox Code Playgroud)ssh 回到您的本地机器(假设这是可能的)并让它与您交谈。请参阅此处了解更多让 OSX 向您发出哔哔声的酷炫方法。
./long_process && ssh you@local.ip say "Yo! All done"
Run Code Online (Sandbox Code Playgroud)
或者
./long_process && ssh you@local.ip terminal-notifier -message "Job finished!" -title "Info"
Run Code Online (Sandbox Code Playgroud)
如果您从动态 IP 连接并且您已配置路由器以便您可以 ssh 到该动态 IP,则可以执行此操作(假设您当前仅从远程计算机连接):
ip=$(who | grep $USER | perl -lne 's/\\((.+?)\\)\s*$//; print "$1"' | tail -n 1) &&
./long_process && ssh you@$ip terminal-notifier -message "Job finished!" -title "Info"
Run Code Online (Sandbox Code Playgroud)
您可以按正常方式设置无密码 ssh 。它不应受动态 IP 的影响。一旦你这样做了,上面的代码就可以工作了。
使用pushover并向您的 Android 或 iOS 设备发送通知(如果您有)
./long_process && pushover.pl "All done"
Run Code Online (Sandbox Code Playgroud)您可以在远程终端中
echo
敲响响铃:\a
./long_process ; echo -e '\a'
某些终端模拟器会播放某种声音并可能显示通知。特别是 iTerm2,如果进程选项卡未聚焦,将显示通知并播放声音。
另外,请注意我曾经;
分隔命令。这样,即使命令返回非零状态,您也会收到通知,而&&
只有在命令成功时才会运行。