ฉันจะทริกเกอร์การแจ้งเตือนเมื่องาน / กระบวนการสิ้นสุดลงได้อย่างไร


86

สถานที่ที่ฉันทำงานมีคำสั่งที่ใช้เวลาดำเนินการนาน

มีคำสั่ง / ยูทิลิตี้ที่ฉันสามารถใช้เพื่อแจ้งให้ฉันทราบเมื่อการดำเนินการคำสั่งสิ้นสุดหรือไม่ อาจเป็นหน้าต่างป๊อปอัพหรืออาจมีเสียงเล็กน้อย


1
@ slhck คำตอบที่ได้รับการยอมรับนั้นยอดเยี่ยม - ฉันควรตระหนักว่าfg;say "Job finished"มันจะได้ผล แต่ ... มีวิธีใดที่มันจะเป็นไปโดยอัตโนมัติเพิ่มเติม - เช่นกดกริ่งหรือแจ้งให้ทราบหลังจากเสร็จงานใด ๆ ที่ใช้เวลามากกว่าเกณฑ์เช่นนาที? มีตัวแปรเชลล์เช่นใน bash นั่นคือเวลาที่ผ่านไปของคำสั่งสุดท้ายหรือไม่
Krazy Glew

... 2 ชั่วโมงต่อมาพบstackoverflow.com/questions/1862510/ … ... วาง '(($ timer_show> $ {LONG_RUNTIME: -300})) && พูดว่า "งานที่ดำเนินการเสร็จสิ้นอย่างยาวนาน" ใน timer_stop ... ต่อไปเพิ่มคำสั่งคอมไพล์ของ emacs ... และแจ้งเตือนนาฬิกา Pebble ของฉัน (ฉันเกลียดการแจ้งเตือนทางโทรศัพท์)
Krazy Glew

คำตอบ:


119

โดยทั่วไปหากคุณรู้สิ่งนี้ก่อนที่จะเรียกใช้คำสั่งคุณสามารถเริ่มได้ด้วย:

command; command-after &

นี้จะดำเนินการcommand-after หลังจากที่ออกคำสั่งก่อนหน้า (ไม่คำนึงถึงรหัสออก) &จะเริ่มต้นในพื้นหลัง

หากคุณสนใจทางออกที่ประสบความสำเร็จหรือล้มเหลวให้ใช้:

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

หากคำสั่งเริ่มต้นแล้วคุณอาจใช้การควบคุมงานเพื่อระงับคำสั่งนั้นจากนั้นส่งคืนคำสั่งนั้นไปยังเบื้องหน้าพร้อมfgกับการแจ้งเตือนของคุณ:

command
# enter Ctrl-z
fg ; command-after

ตอนนี้…สิ่งที่คุณต้องการทำหลังจากนี้ขึ้นอยู่กับสภาพแวดล้อมของคุณ

  • บนระบบใด ๆคุณสามารถ"แหวน" ระฆังขั้ว ขึ้นอยู่กับระบบที่แน่นอนของคุณสิ่งที่ใช้งานได้จริง (BSD กับ GNU Linux ฯลฯ ) แต่tput belควรทำ แม้ว่าตอนนี้ฉันไม่สามารถทดสอบได้อย่างน่าเชื่อถือ ค้นหา "เสียงกระดิ่ง" เพื่อค้นหาเพิ่มเติม

  • ในMac OS Xคุณสามารถใช้ AppleScript เพื่อเปิดกล่องโต้ตอบ Finder:

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

    คุณสามารถให้มันพูดอะไรบางอย่างกับคุณ:

    say "Job finished"
    

    หรือคุณสามารถใช้ระบบการแจ้งเตือนของ Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • ในGNOME , zenityสามารถแสดง GTK กล่องโต้ตอบเรียกจากบรรทัดคำสั่ง ดูเพิ่มเติมคำถามนี้กองมากเกิน: แสดงกล่องข้อความจากสคริปต์ทุบตีในลินุกซ์ มันสามารถติดตั้งผ่านผู้จัดการแพคเกจที่คุณชื่นชอบ

    zenity --info --text="Job finished"
    
  • xmessageกระจายบางคนอาจมี โดยเฉพาะสำหรับสภาพแวดล้อม GTK gxmessageมี

  • ในสภาพแวดล้อมเดสก์ท็อปที่ใช้ข้อกำหนดการแจ้งเตือนของเดสก์ท็อปเช่นUbuntuและGNOME จะมีระบบการแจ้งเตือนที่คุณสามารถทริกเกอร์ด้วยnotify-send(ส่วนหนึ่งlibnotify)

    notify-send "Job finished!"
    
  • KDEใช้kdialogตัวอย่างเช่น:

    kdialog --passivepopup 'Job finished'
    

ให้ฉันรู้ว่าคุณใช้คำสั่งอะไร! ฉันเพิ่มตัวเลือกอื่น ๆ เช่นกัน
slhck

ฉันเล่นซอกับการแจ้งเตือนการส่งและ xmessage ทั้งคู่ดูเหมือนจะน่าสนใจ! นี่คือสิ่งต่อไปที่ฉันกำลังมองหา - superuser.com/questions/345463/…
Utkarsh Sinha

2
บน Mac OS X คุณยังสามารถใช้ยูทิลิตีบรรทัดคำสั่ง "พูด" นอกจากนี้ยังมีเสียงมากมายให้ตรวจสอบ "say -h";)
trinth

1
เหตุใดคุณจึงแนะนำว่า "command-after" ควรรันแบบอะซิงโครนัส? คุณหมายถึงการพูด(command; command-after) &เหรอ?
G-Man

โซลูชันนี้มีไว้สำหรับผู้ใช้ Konsole และไม่ใช่โซลูชันที่สมบูรณ์แบบเนื่องจากต้องอาศัยคำสั่งของคุณอย่างละเอียดจนกว่าจะเสร็จสมบูรณ์หรือปิดเสียงเงียบ (ไม่มีเอาต์พุต) จนกว่าจะเสร็จสมบูรณ์เมื่อถึงจุดที่พร้อมท์ส่งคืน อย่างไรก็ตามนี่คือสิ่งที่ฉันต้องการเมื่อฉันมาเพื่อขอความช่วยเหลือ คุณสามารถกำหนดค่า Konsole ให้ป๊อปอัปการแจ้งเตือนเล่นเสียง ฯลฯ จากนั้นคุณต้องเปิดการตรวจสอบเชลล์ ตรวจสอบความเงียบถ้าคำสั่งของคุณแสดงผลเป็นกลุ่มจนกว่าจะเสร็จสิ้นหรือปิดเสียงหากไม่พิมพ์อะไรออกมาจากนั้นเชลล์จะส่งคืน
MrMas

20

บนระบบที่เหมือนยูนิกซ์คุณสามารถกดออดเสียงได้:

echo -e "\a"

สิ่งนี้มีประโยชน์จริง ๆ นอกเหนือจากการแจ้งเตือนข้อความบน mac
Sirens

2
เช่นเดียวกับtput bel
Dwight Spencer


5

spd-say "Some text"ที่จะได้รับการแจ้งเตือนเสียงคุณสามารถใช้ ตัวอย่าง:

some-command; spd-say "Yo"

ระบบปฏิบัติการอะไร ฉันไม่เห็นบน Mac หรือ Ubuntu
Edward Falk

@EdwardFalk ฉันใช้ Ubuntu
milkovsky

ตกลงฉันใช้เวอร์ชั่นเก่าอยู่แล้วบางทีมันอาจจะเป็นเวอร์ชั่นที่ใหม่กว่า
Edward Falk

1
มันเป็นเพียงแอปพลิเคชันแปลงข้อความเป็นเสียงพูด sudo apt-get install speech-dispatcherคุณสามารถติดตั้งผ่านทาง หรือใช้ทางเลือกaskubuntu.com/questions/501910/…
milkovsky

อ่าไม่ได้ติดตั้งโดยค่าเริ่มต้น? ฉันควรคิดเกี่ยวกับเรื่องนี้ ขอบคุณสำหรับลิงค์
Edward Falk

4

ฉันเพิ่งเริ่มใช้notifuสำหรับการแจ้งเตือนทางเดสก์ท็อปจาก Cygwin มันเป็นแอพแจ้งเตือนบรรทัดคำสั่งสำหรับ Windows

ตัวอย่าง:

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

4

ฉันเขียนntfyเพื่อวัตถุประสงค์นี้ เป็นแพลตฟอร์มข้ามและสามารถส่งการแจ้งเตือนโดยอัตโนมัติเมื่อคำสั่งที่ใช้เวลานานสิ้นสุด

หากคุณมี Python pip(ส่วนใหญ่ Linux distros และ MacOS มี) ต่อไปนี้เป็นวิธีการติดตั้งและเปิดใช้งานการแจ้งเตือนอัตโนมัติ:

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

ตรวจสอบที่http://ntfy.rtfd.io

นอกจากนั้นมันยังสามารถ:

  • ยกเลิกการแจ้งเตือนอัตโนมัติเมื่อเครื่องอยู่ในเบื้องหน้า (X11, iTerm2 & Terminal.app รองรับและเปิดใช้งานโดยค่าเริ่มต้น)
  • ส่งการแจ้งเตือนบนคลาวด์ (Pushover, Pushbullet และ XMPP)
  • ใช้เพื่อส่งการแจ้งเตือนเมื่อกระบวนการสิ้นสุดลง (ไม่ใช่การสนับสนุนอัตโนมัติดังกล่าวข้างต้น)
  • ส่งการแจ้งเตือนด้วยตนเอง (เหมาะสำหรับใช้ในสคริปต์!)

ดีสำหรับคุณ. นี่เป็นคำตอบที่ใช้งานได้จริงที่สุด
Adam Bittlingmayer

ฉันเห็นด้วย. ฉันใช้เพื่อแสดงการแจ้งเตือนบนเดสก์ท็อปของฉันและผลักดันการแจ้งเตือนไปยังโทรศัพท์ของฉันในเวลาเดียวกัน
Michael

3

สำหรับ Linux มีเคล็ดลับที่ดีในการทำสิ่งนี้โดยอัตโนมัติโดยไม่ต้องพิมพ์คำสั่งสำหรับการแจ้งเตือนทุกครั้ง

เริ่มแรกติดตั้ง autokey สิ่งนี้จะช่วยกำหนดการกระทำสำหรับการกดแป้นที่แตกต่างกัน

sudo apt-get install autokey-gtk

ตอนนี้กำหนดวลีใหม่ใน autokey และกำหนดปุ่มลัดเป็น Alt + Enter เพิ่มวลีนี้:

; notify-send "Job finished!" &
  #

โปรดทราบว่าบรรทัดใหม่หลังจากบรรทัดแรกมีความสำคัญ

รวมทั้งเพิ่มตัวกรองหน้าต่าง ฉันใช้ guake และ terminal รวมเทอร์มินัลอื่นที่คุณใช้

.*(guake)|(Terminal).*

คุณทำเสร็จแล้ว !!

ตอนนี้ทุกครั้งที่คุณต้องการรับการแจ้งเตือนสำหรับคำสั่งให้รันโดยใช้ Alt + Enter แทน Enter / Return

ที่มา: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

แม้ว่าคำตอบอื่น ๆ ครอบคลุมวิธีการรับการแจ้งเตือนงานเสร็จแล้วส่วนใหญ่ฉันต้องการให้สองเซ็นต์ของฉันเนื่องจากคุณถามคำถามของคุณในรูปแบบต่อไปนี้:

สถานที่ที่ฉันทำงานมีคำสั่งที่ใช้เวลาดำเนินการนาน

ผมมีปัญหาเดียวกัน. บางครั้งบางสิ่งบางอย่างสามารถทำงานได้ 15 นาที

ฉันมีฟังก์ชั่นต่อไปนี้ใน. 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
}

สิ่งนี้ใช้แอป Pushover เพื่อส่งการแจ้งเตือนไปยังโทรศัพท์ของฉัน วิธีนี้ฉันสามารถไปทานอาหารกลางวันหรือเข้าร่วมการประชุมและยังคงได้รับแจ้งเกี่ยวกับงานที่ฉันเริ่มบนคอมพิวเตอร์ก่อนที่ฉันจะจากไป

ฉันใช้ในลักษณะดังต่อไปนี้:

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

ดังนั้นหากคำสั่งส่งคืนรหัสออกที่ถูกต้องการกดครั้งแรกจะถูกดำเนินการ ในข้อผิดพลาดอันที่สองจะถูกประหารชีวิต

Ofc คุณต้องสร้างผู้ใช้ที่ Pushover และลงทะเบียนแอพเพื่อส่งการแจ้งเตือนจาก https://pushover.net/

หวังว่านี่จะช่วยได้!


ตกลงดังนั้น "pushover" เป็นบริการบนเว็บที่ส่งการแจ้งเตือนไปยังโทรศัพท์ที่ติดตั้งแอพ "pushover"
Edward Falk

1
มันเป็นบริการเว็บที่ส่งการแจ้งเตือนไปยังโทรศัพท์มือถือคอมพิวเตอร์และทุกอย่างกับเว็บเบราว์เซอร์ที่ทันสมัย ดังนั้นคุณสามารถเปิดการใช้งานแบบพุชโอเวอร์บนพีซีและโทรศัพท์ของคุณและได้รับแจ้งบนอุปกรณ์ทั้งหมด เรียบร้อยเหรอ? :-)
Thatkookooguy

1

หากคุณใช้ csh หรือ tcsh เป็นเชลล์เชิงโต้ตอบของคุณคุณสามารถใช้notifyคำสั่ง:

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

คุณสามารถบรรลุผลที่คล้ายกันในทุบตีด้วยหรือset -bset -o notify

สิ่งนี้อาจไม่ตรงกับความต้องการของคุณเนื่องจากทั้งหมดจะพิมพ์ข้อความ ฉันไม่คิดว่ามันสามารถกำหนดค่าให้เปิดหน้าต่างหรือส่งเสียงกริ่ง


ฉันพยายามหลีกเลี่ยงการดูเปลือกเพื่อดูว่างานเสร็จหรือไม่ ขอบคุณ แต่!
Utkarsh Sinha


1

หากคุณกำลังใช้npmแล้วโหนดแจ้งให้แก้ปัญหาข้ามแพลตฟอร์ม

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

ดูตัวอย่าง

  • Linux KDE

Linux KDE

  • ของ windows

ของ windows

  • Mac OS

แม็ค

  • การคำราม

การคำราม


1

หวังว่าฉันจะสังเกตเห็นหัวข้อนี้ปีที่ผ่านมา วิธีการแก้ปัญหาของฉันเป็นหลักเช่นเดียวกับของ slhck แต่ฉันเขียนสคริปต์ ฉันจะใช้มันตลอดเวลา. โพสต์ที่นี่เพื่อแบ่งปัน

#!/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

หนึ่งคำอธิบายเล็กน้อย: สตริง"\x1b]0;$msg\a"เป็นลำดับการหลบหนีของ ANSI เพื่อนำข้อความไปไว้ในแถบชื่อเรื่องของหน้าต่างที่ถูกเรียกใช้งาน ฉันพบว่ามันค่อนข้างมีประโยชน์ในบางครั้งที่สามารถเห็นหน้าต่างที่เป็นข้อความที่มาจาก


1

ดังนั้นสิ่งนี้มาสายค่อนข้างช้า แต่ฉันได้เริ่มใช้ระบบเพื่อทำสิ่งนี้: ฉันมีสคริปต์ทุบตีซึ่งจะเรียกใช้งานคำสั่งใดก็ตามที่ถูกส่งผ่านไปหลังจากนั้น

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

#!/bin/bash


# file location : /usr/bin/n

set +e


# $@ executes whatever command is typed after the filename

$@


notify-send "Task Completed"

แล้วฉันก็เติม n

n bundle install
n npm install


0

ฉันสร้างแอพที่จะส่งการแจ้งเตือนไปยังโทรศัพท์ Android ของคุณเมื่อกระบวนการสิ้นสุดลงดังนั้นคุณไม่จำเป็นต้องเชื่อมต่อกับคอมพิวเตอร์ของคุณ

ติดตั้งจากนั้นเพิ่ม;notifier.shไปยังจุดสิ้นสุดของคำสั่งของคุณ

ตัวอย่างเช่นหากคำสั่งของคุณเป็นmake installคุณจะทำให้คำสั่งของคุณ:

make install; notifier.sh

https://notifier.sh

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.