Làm cách nào để kích hoạt thông báo khi công việc / quy trình kết thúc?


86

Nơi tôi làm việc có các lệnh mất nhiều thời gian để thực thi.

Có một lệnh / tiện ích mà tôi có thể sử dụng để thông báo cho tôi khi việc thực thi lệnh kết thúc không? Nó có thể là một cửa sổ bật lên hoặc có thể một chút âm thanh.


1
Câu trả lời được chấp nhận của @ slhck rất tuyệt - Tôi nên nhận ra rằng nó fg;say "Job finished"sẽ hoạt động. Nhưng ... có cách nào để nó có thể được tự động hóa hơn nữa không - tức là rung chuông hoặc thông báo sau khi hoàn thành bất kỳ công việc nào mất nhiều hơn một ngưỡng như một phút? Có một biến shell, ví dụ như trong bash, đó là thời gian trôi qua của lệnh cuối cùng không?
Krazy Glew

... 2 giờ sau, đã tìm thấy stackoverflow.com/questions/1862510/ từ ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && nói "công việc chạy dài đã hoàn thành"' trong timer_stop ... tiếp theo, thêm vào các lệnh biên dịch của emacs ... và thông báo cho đồng hồ Pebble của tôi (tôi ghét thông báo qua điện thoại)
Krazy Glew

Câu trả lời:


119

Nói chung, nếu bạn biết điều này trước khi chạy lệnh, bạn có thể bắt đầu với:

command; command-after &

Điều này sẽ thực thi command-after sau khi lệnh trước đó đã thoát (bất kể mã thoát của nó). Các &sẽ bắt đầu nó ở chế độ nền.

Nếu bạn quan tâm đến một lối thoát thành công hay thất bại, hãy sử dụng tương ứng:

command && command-after-only-if-success &
command || command-after-only-if-fail &

Nếu lệnh đã bắt đầu, bạn có thể sử dụng điều khiển công việc để tạm dừng nó, sau đó đưa nó trở lại nền trước với fgchuỗi thông báo của bạn:

command
# enter Ctrl-z
fg ; command-after

Bây giờ, những gì bạn muốn làm sau này phụ thuộc vào môi trường của bạn.

  • Trên bất kỳ hệ thống nào , bạn có thể "rung" chuông thiết bị đầu cuối . Phụ thuộc vào hệ thống chính xác của bạn những gì thực sự hoạt động (BSD so với GNU Linux, v.v.), nhưng tput belnên làm. Mặc dù vậy, tôi không thể kiểm tra nó ngay bây giờ. Tìm kiếm "chuông reo" để tìm hiểu thêm.

  • Trên Mac OS X , bạn có thể sử dụng AppleScript để bật lên hộp thoại Finder:

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    Bạn có thể nói điều gì đó với bạn:

    say "Job finished"
    

    Hoặc bạn có thể sử dụng hệ thống thông báo của Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • Trong Gnome , zenitycó thể hiển thị hộp thoại GTK, được gọi từ dòng lệnh. Xem thêm câu hỏi Stack Overflow này: hiển thị hộp thông báo từ tập lệnh bash trong linux . Nó có thể được cài đặt thông qua trình quản lý gói yêu thích của bạn.

    zenity --info --text="Job finished"
    
  • Một số bản phân phối có thể có xmessage. Cụ thể cho môi trường GTK, có gxmessage.

  • Trên các môi trường máy tính để bàn triển khai Đặc tả Thông báo Máy tính để bàn , chẳng hạn như UbuntuGnome , có một hệ thống thông báo mà bạn có thể kích hoạt notify-send(một phần của libnotify).

    notify-send "Job finished!"
    
  • KDE sử dụng kdialog, ví dụ:

    kdialog --passivepopup 'Job finished'
    

Hãy cho tôi biết bạn đã sử dụng lệnh nào! Tôi đã thêm một số tùy chọn khác là tốt.
slhck

Tôi loay hoay với thông báo gửi và xmessage. Cả hai dường như là thú vị! Đây là điều tiếp theo tôi đang tìm kiếm - superuser.com/questions/345463/ từ
Utkarsh Sinha

2
trên Mac OS X, bạn cũng có thể sử dụng tiện ích dòng lệnh "say". cũng có nhiều giọng nói có sẵn, kiểm tra "say -h";)
trinth

1
Tại sao bạn đề xuất rằng "lệnh sau" nên được chạy không đồng bộ? Ý bạn là nói (command; command-after) &sao?
G-Man

Giải pháp này dành cho người dùng Konsole và không phải là một giải pháp hoàn hảo vì nó dựa vào lệnh của bạn hoặc là dài dòng cho đến khi hoàn thành hoặc hoàn toàn im lặng (không có đầu ra) cho đến khi hoàn thành tại thời điểm mà dấu nhắc trả về. Tuy nhiên, đây chính xác là những gì tôi cần khi tôi tìm kiếm sự giúp đỡ. Bạn có thể định cấu hình Konsole để bật lên thông báo, phát âm thanh, v.v. Sau đó, bạn phải bật giám sát vỏ. Theo dõi sự im lặng nếu lệnh của bạn xuất ra một loạt các công cụ cho đến khi hoàn thành hoặc im lặng nếu nó không in ra bất cứ thứ gì và sau đó trình bao trả lại.
MrMas

20

Trên các hệ thống giống như unix, bạn có thể rung chuông âm thanh:

echo -e "\a"

Điều này thực sự hữu ích ngoài thông báo tin nhắn trên mac
Sirens

2
giống nhưtput bel
Dwight Spencer


5

Để có được một thông báo âm thanh, bạn có thể sử dụng spd-say "Some text". Thí dụ:

some-command; spd-say "Yo"

HĐH gì? Tôi không thấy nó trên Mac hoặc Ubuntu
Edward Falk

@EdwardFalk Tôi đang sử dụng Ubuntu
milkovsky

OK, tôi đang sử dụng một phiên bản khá cũ, vì vậy có lẽ đó là phiên bản mới hơn.
Edward Falk

1
Nó chỉ là một ứng dụng chuyển văn bản thành giọng nói. Bạn có thể cài đặt nó thông qua sudo apt-get install speech-dispatcher. Hoặc sử dụng các lựa chọn thay thế Askubfox.com/questions/501910/ Lời
milkovsky

Ahh, không được cài đặt theo mặc định? Tôi nên nghĩ về điều đó. Cảm ơn các liên kết.
Edward Falk

4

Tôi mới bắt đầu sử dụng notifu cho các thông báo trên máy tính để bàn từ Cygwin. Đây là một ứng dụng thông báo dòng lệnh cho Windows.

Thí dụ:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."

4

Tôi đã viết ntfycho chính xác mục đích này. Nó là đa nền tảng và có thể tự động gửi thông báo khi các lệnh chạy dài kết thúc.

Nếu bạn có Python pip(hầu hết các bản phân phối Linux và MacOS đều có), đây là cách cài đặt và bật thông báo tự động:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Kiểm tra nó tại http://ntfy.rtfd.io

Ngoài ra, nó cũng có thể:

  • thay thế thông báo tự động khi thiết bị đầu cuối ở phía trước (X11, iTerm2 & Terminal.app được hỗ trợ và bật theo mặc định)
  • gửi thông báo dựa trên đám mây (Pushover, PushbONS và XMPP)
  • được sử dụng để gửi thông báo khi quá trình kết thúc (không phải là hỗ trợ tự động đã nói ở trên)
  • gửi thông báo theo cách thủ công (tốt để sử dụng trong tập lệnh!)

Tốt cho bạn Đây thực sự là câu trả lời hữu dụng nhất.
Adam Bittlingmayer

Tôi đồng ý. Tôi sử dụng nó để hiển thị thông báo trên máy tính để bàn của mình và đẩy thông báo đến điện thoại của tôi cùng một lúc.
Michael

3

Đối với Linux, có một thủ thuật tiện lợi để thực hiện việc này một cách tự động mà không cần phải gõ lệnh để thông báo mỗi lần.

Đầu tiên cài đặt autokey. Điều này giúp xác định hành động cho các tổ hợp phím khác nhau.

sudo apt-get install autokey-gtk

Bây giờ, hãy xác định một cụm từ mới trong autokey và gán phím nóng là Alt + Enter. Thêm cụm từ này:

; notify-send "Job finished!" &
  #

Lưu ý rằng một dòng mới sau dòng đầu tiên là quan trọng.

Ngoài ra, thêm một bộ lọc cửa sổ. Tôi sử dụng guake và thiết bị đầu cuối. Bao gồm bất kỳ thiết bị đầu cuối khác mà bạn sử dụng.

.*(guake)|(Terminal).*

Bạn đã hoàn tất!!

Bây giờ, mọi lúc bất cứ khi nào bạn cần nhận thông báo cho lệnh, hãy chạy nó bằng Alt + Enter thay vì Enter / Return.

Nguồn: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

Mặc dù các câu trả lời khác đã bao gồm hầu hết các cách để nhận thông báo về một công việc đã hoàn thành, tôi muốn đưa ra hai xu của mình kể từ khi bạn hỏi câu hỏi của bạn theo định dạng sau:

Nơi tôi làm việc có các lệnh mất nhiều thời gian để thực thi.

Tôi có cùng một vấn đề. Đôi khi một cái gì đó có thể chạy trong 15 phút.

Tôi có chức năng sau trong .bashrc:

# push a notification to your phone. can be handy if you're running a
# build and you want to be notified when it's finished.
push() {
    curl -s -F "token=PUSHOVER_TOKEN" \
    -F "user=PUSHOVER_USER" \
    -F "title=terminal" \
    -F "message=$1" https://api.pushover.net/1/messages.json > /dev/null 2>&1
}

Điều này sử dụng ứng dụng Pushover để đẩy thông báo đến điện thoại của tôi. Bằng cách này, tôi có thể đi ăn trưa hoặc tham gia một cuộc họp và vẫn được thông báo về các công việc tôi đã bắt đầu trên máy tính của mình trước khi tôi rời đi.

Tôi sử dụng nó theo cách sau:

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

Vì vậy, nếu lệnh trả về mã thoát chính xác, lần đẩy đầu tiên sẽ được thực thi. Khi có lỗi, cái thứ hai sẽ được thực thi.

Tất nhiên, bạn cần tạo người dùng tại Pushover và đăng ký một ứng dụng để gửi thông báo từ https://pushover.net/

Hy vọng điều này sẽ giúp!


OK, vậy "đẩy" là một dịch vụ web gửi thông báo đến các điện thoại đã cài đặt ứng dụng "đẩy"?
Edward Falk

1
đó là một dịch vụ web gửi thông báo đến điện thoại, máy tính và mọi thứ với trình duyệt web hiện đại . Vì vậy, bạn có thể mở đẩy trên PC và điện thoại và được thông báo trên tất cả các thiết bị. gọn gàng hả? :-)
Thatkookooguy

1

Nếu bạn sử dụng csh hoặc tcsh làm vỏ tương tác, bạn có thể sử dụng notifylệnh:

% long-running-command &
[1] 14431
% notify %1
% 
(later, when the command finishes)
[1]    Done                          long-running-command

Bạn có thể đạt được một hiệu ứng tương tự trong bash với set -bhoặc set -o notify.

Điều này có thể không đáp ứng yêu cầu của bạn, vì tất cả những gì nó làm là in một tin nhắn; Tôi không nghĩ rằng nó có thể được cấu hình để bật lên một cửa sổ hoặc rung chuông.


Tôi đang cố gắng tránh nhìn vào cái vỏ để tìm hiểu xem một công việc đã hoàn thành chưa. Cảm ơn, mặc dù!
Utkarsh Sinha


1

Nếu bạn đang sử dụng npmthì trình thông báo nút cung cấp giải pháp đa nền tảng .

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

Xem trước

  • Linux KDE

Linux KDE

  • các cửa sổ

các cửa sổ

  • hệ điều hành Mac

mac

  • Gầm gừ

Gầm gừ


1

Ước gì tôi nhận thấy chủ đề này nhiều năm trước. Giải pháp của tôi về cơ bản giống như của slhck, nhưng tôi đã viết một kịch bản. Tôi sử dụng nó mọi lúc. Đăng ở đây để chia sẻ nó.

#!/bin/bash

msg='all done'
quiet=false
if [ "$1" = '-q' ]; then quiet=true; shift; fi
if [ $# -gt 0 ]; then msg="$*"; fi

echo -ne "\x1b]0;$msg\a"
if [ -x /usr/bin/zenity ]; then
  unset WINDOWID
  exec zenity --info --text="$msg"
elif [ -x /usr/bin/xmessage ]; then
  exec xmessage -nearmouse "$msg"
elif [ -x /usr/bin/osascript ]; then
  if ! $quiet; then say "done" &; fi
  osascript -e "tell application \"System Events\" to display dialog \"$msg\""
else
  echo $msg
fi

Một chút giải thích: chuỗi "\x1b]0;$msg\a"là chuỗi thoát ANSI để đặt thông điệp vào thanh tiêu đề của cửa sổ mà từ đó nó được thực thi. Đôi khi tôi thấy nó khá tiện dụng để có thể xem cửa sổ đó là thông điệp đến từ đâu.


1

Vì vậy, điều này đến khá muộn, nhưng tôi đã bắt đầu sử dụng một hệ thống để làm điều này: Tôi có một tập lệnh bash thực thi bất kỳ lệnh nào được truyền cho nó sau đó

http://somesh.io/2017/02/19/get-notified-when-long-commands-are-done-executing-on-ub Ubuntu /

#!/bin/bash


# file location : /usr/bin/n

set +e


# $@ executes whatever command is typed after the filename

$@


notify-send "Task Completed"

và sau đó tôi chỉ cần trả trước n

n bundle install
n npm install


0

Tôi đã tạo một ứng dụng sẽ gửi thông báo tới điện thoại Android của bạn khi quá trình kết thúc để bạn không bị ràng buộc với máy tính của mình.

Cài đặt, sau đó thêm ;notifier.shvào cuối lệnh của bạn.

Ví dụ: nếu lệnh của bạn là make install, bạn sẽ thực hiện lệnh của mình:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.