2009-04-13 6 views
8

Tôi đang tìm bash của tôi để bíp, nếu lệnh tôi thực hiện mất nhiều hơn so với thời gian tường nhất định (nói 1 phút).bash to beep nếu lệnh mất hơn 1 phút để hoàn thành

nếu nó tiếp tục kêu bíp mỗi vài phút ở đó sau khi cho đến khi tôi nhấn enter hoặc một cái gì đó .. đó là greate.

Bất kỳ ý tưởng thông minh nào?

Tôi có thể sử dụng chức năng giám sát của màn hình như phương sách cuối cùng. (Tôi đang trên Cygwin, nhưng điều đó không quan trọng).

Hãy để tôi làm rõ:

$ ls  
    < output appears > 
$ rsync foo bar 
    < since this takes lot of time, i switch to other console 
     and forget this .. .and remember only after some time > 
    < so when this finished, i want it to beep > 
+0

tôi hy vọng tập lệnh được cung cấp là những gì bạn cần – Drakosha

Trả lời

2

Có lệnh trong Linux mà sẽ phát ra tiếng bíp cho bạn. Kiểm tra mã nguồn cho tiếng bíp có sẵn với Ubuntu (và có thể là các bản phân phối khác) hoặc xem http://www.johnath.com/beep/beep.c cho một nguồn khác (đó là cùng mã, tôi tin).

Nó cho phép bạn kiểm soát tần suất, độ dài và lặp lại (trong số những thứ khác) một cách dễ dàng.

Để thực sự làm cho nó hoạt động, bạn sẽ cần một tập lệnh bắt đầu chương trình công nhân thực tế của bạn ở chế độ nền, sau đó đi vào vòng lặp "sleep 60", bíp cho đến khi nó kết thúc.

Tập lệnh sau phải là một khởi đầu tốt. Bạn chạy nó với một cái gì đó như:

beeper sleep 3600 

và chạy sleep 3600 ở chế độ nền, bíp mỗi phút cho đến khi nó kết thúc.

#!/bin/bash 
$* & 
pid=$! 
oldmin=$(date +%M) 
exf=$pid 
while [[ $exf == $pid ]] ; do 
    min=$(date +%M) 
    if [[ $oldmin != $min ]] ; then 
     beep 
     oldmin=$min 
    fi 
    exf="$(ps -ef | awk '{print $2}' | grep $pid)" 
    sleep 2 
done 

Đây là cách hoạt động. Nó chạy các đối số dưới dạng một tiến trình nền và lưu ID tiến trình. Sau đó, nó lặp lại mỗi vài giây, kiểm tra khi nào phút thay đổi và bíp khi đó là trường hợp (vì vậy tiếng bíp đầu tiên ở đây có thể là bất cứ điều gì lên đến một phút).

Thoát khỏi vòng lặp xảy ra khi quá trình biến mất khỏi đầu ra của ps.

Bạn thậm chí có thể làm bíp ngủ 3600 & để đặt toàn bộ lô trong nền. Để ngừng tiếng bíp, hãy tắt quá trình bíp (nếu bạn muốn công việc tiếp tục mà không có tiếng bíp) hoặc giết chính quy trình công nhân (điều này sẽ ngừng cả công việc và tiếng bíp).

+1

1. '$ *'? Việc mở rộng từ ngữ và mở rộng tên đường sẽ ăn các em bé của bạn. 2. 'ps' để kiểm tra xem liệu một PID có còn sống không? Nonono, giết người, đọc về giết -0. 3. Sự phức tạp nhiều? – lhunath

+0

Đó là lý do tại sao tôi đã nói kịch bản là một sự khởi đầu (tôi cũng không thêm các tính năng khác như tin nhắn trợ giúp hoặc lỗi kiểm tra xem lệnh có bắt đầu hay không). Ps hoạt động tốt vì vậy không cần phải thay đổi nó, mặc dù chức năng khác có sẵn (tôi thừa nhận tôi không biết về 'giết -0', nó tốt đẹp). – paxdiablo

-1

tôi không biết ăn nói lấc cấc nếu nó hoạt động trên bash, nhưng với nhiều vỏ giống như

command && echo ^G 

(ctrl-g) sẽ phát ra tiếng bíp sau khi hoàn thành thành công của lệnh. Điều này thường hữu ích khi bạn muốn thực hiện một lệnh chạy dài và sau đó đi làm việc trong một cửa sổ khác nhưng được thông báo khi điều đầu tiên kết thúc. (Tôi không rõ ràng nếu đó là mục tiêu của bạn hay không.)

0

tôi chắc chắn rằng tôi đã sử dụng một cái gì đó như:

echo "\007" 

không có một * nix vỏ tiện để kiểm tra.

+1

'echo -e" \ 007 "' hoạt động đối với tôi trên linux/bsd – xkcd150

0
echo "\007" 
  • tiếng bíp cho tôi.

    $!

  • trả về pid của quá trình cuối cùng chạy trong nền trong bash, vì vậy bạn có thể ngủ trên đó và xác minh xem nó vẫn đang chạy.

Để rõ ràng hơn, hãy chụp pid bằng $! và ngủ trong vòng lặp vô tận và kiểm tra xem pid ở trên vẫn còn sống.

Sau (hy vọng) hiểu biết những gì bạn muốn, đây là các mã:

#! /bin/bash 

if [[ "$#" != "1" ]] 
then 
    echo "Usage: $0 <command>" 
    echo "Will wait till the command finishes and starts beeping once a minute" 
    exit 1 
fi 

CMD="$1" 
SECS_BETWEEN_BEEPS="60" 

# echo commmand and start time: 
echo "@@ Command: '${CMD}'" 
echo "@@ Starting at `date`" 

# execute and wait till finish: 
"${CMD}" 
wait 

# echo finish time: 
echo "@@ Finished at `date`" 

# beep once in SECS_BETWEEN_BEEPS: 
while ((1)) 
do 
    echo -en '\a' 
    sleep "${SECS_BETWEEN_BEEPS}" 
done 
-2

Bạn đang yêu cầu hai điều hoàn toàn khác nhau ở đây. Trước tiên, bạn yêu cầu phải làm gì để có tiếng bíp sau một phút, sau đó bạn yêu cầu nhận được tiếng bíp sau khi lệnh kết thúc. Đây là hai điều được tiếp cận hoàn toàn khác nhau.

# bof [command] [args...] - Beep on Finish 
bof() { 
    "[email protected]"; local r=$? 

    printf '\a' 
    return $r 
} 

Chức năng này đang điều hành một lệnh và sau đó tiếng bíp một lần một lần của lệnh làm, trong khi đảm bảo rằng mã lối ra của lệnh là mã lối ra của hàm.

# bot [command] [args...] - Beep on Timeout 
bot() { 
    { sleep 60; printf '\a'; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

Chức năng này phát ra tiếng bíp một lần sau một thời gian nhất định trừ khi lệnh hoàn thành trước thời gian đó (ở đây, 60 giây, một phút).

# bem [command] [args...] - Beep every Minute 
bem() { 
    { while sleep 60; do printf '\a'; done; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

Đây là một thích ứng đơn giản của hàm trước đây tiếng bíp mỗi phút càng lâu càng lệnh của bạn vẫn còn sống.

# bofem [command] [args...] - Beep on Finish every Minute 
bofem() { 
    "[email protected]"; local r=$? 

    until read -t 60 -n 1; do printf '\a'; done 
    return $r 
} 

Và cuối cùng, một chức năng mà tiếng bíp mỗi phút nhưng chỉ sau khi lệnh đã hoàn tất. Giữ bíp cho đến khi bạn nhấn một phím để dừng nó. Sau đó, hàm trả về với mã thoát của lệnh của bạn.

Tôi nghĩ rằng điều đó sẽ đề cập đến tất cả các căn cứ bạn có thể đã dự định với câu hỏi của bạn.

sử dụng (và kết hợp) họ như vậy:

bof rsync foo bar:  # Beep when rsync finishes. 
bot ssh foo 'ls bar/' # Beep if the 'ssh' process takes too long to run. 
0

Tôi thích câu trả lời cung cấp bởi Pax. Có một cái nhìn vào những gì 'bíp' có thể làm:

[email protected]:/usr/src/linux # beep --help 

Cách sử dụng: beep [freq -f] [chiều dài -l] [-r reps] [chậm trễ -d] [chậm trễ -D] [ -s] [-c] [-e thiết bị]

tiếng bíp [Tùy chọn ...] [-n] [--new] [Tùy chọn ...] ... tiếng bíp [-h] [- -help] tiếng bíp [-v] [-V] [--version]

Vì vậy, bạn có thể dao động tiếng bíp (làm to hơn, dài hơn hoặc cả hai) làm chương trình tiếp tục chạy lâu hơn dự kiến.

Nếu bạn làm việc ở đó, bạn có thể có kịch bản chơi các phiên bản MUSAC của lượt truy cập yêu thích của mọi người, điều này chắc chắn sẽ thu hút ai đó đến nhà ga nếu không có lý do nào khác.

3

Một gợi ý khiêm tốn: Nếu bạn có một lệnh mà bạn biết sẽ mất một lúc, chỉ cần làm theo lệnh bằng dấu chấm phẩy, sau đó bíp.

rsync foo bar; beep