ডেস্কটপ বিজ্ঞপ্তি যখন দীর্ঘ চলমান কমান্ডগুলি সম্পূর্ণ হয়


59

আমি একটি ডেস্কটপ বিজ্ঞপ্তি চাই যখনই কোনও কমান্ড যা 15 সেকেন্ডেরও বেশি সময় ধরে চালিত হয়, ইন্টারেক্টিভ শেলের মধ্যে শেষ হয়।

অন্য কথায়, আমি চাই যে সমস্ত কমান্ড এই জাতীয় কিছুতে আবৃত থাকবে

start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"

ব্যাশে এটি সম্পাদন করার সর্বোত্তম উপায় কী?




আপনি এখনই কেন "ইন্টারেক্টিভ শেল ইন" যুক্ত করলেন? এটি এক বছরেরও বেশি সময় ধরে আপনার মূল পোস্টের প্রসঙ্গে বিদ্যমান বিদ্যমান কয়েকটি উত্তরকে অকার্যকর করতে পারে। ইন্টারেক্টিভ শেলটির জন্য বিশেষত যদি আপনার কোনও সমাধানের প্রয়োজন হয় তবে এটিকে উল্লেখ করে পৃথক প্রশ্ন জিজ্ঞাসা করুন।
সের্গেই কোলোডিয়াজনি

"ইন্টারেক্টিভ শেল" অংশটি সম্পাদনার আগে প্রথম মন্তব্যে স্পষ্ট করা হয়েছিল। আমি কেবল প্রশ্নটি সম্পাদনা করেছি এবং মন্তব্যটি সরিয়েছি। এছাড়াও, প্রশ্নগুলিতে পোস্ট করা 3 টি লাইন একটি স্ক্রিপ্টের জন্য ভাল কাজ করে।
আইওউব

উত্তর:


24

যদি আপনি চান https://launchpad.net/undistract-me (দিয়ে উবুন্টু আর্কাইভ থেকে ইনস্টলযোগ্য sudo apt-get install undistract-me) যে অবিকল কি আপনি সম্ভাব্য দীর্ঘ কিছু অতিরিক্ত যোগ করার জন্য মনে রাখা জন্য বলছি, স্বয়ংক্রিয়ভাবে কাজ (যেমন সহ করেও না কমান্ড চলমান)।


1
মনে হচ্ছে এটি কাজ করছে না। আমি এটি ইনস্টল করেছি, আমার সিস্টেমটি পুনরায় চালু করেছি এবং এটি দিয়ে পরীক্ষা করেছি sleep 30, তবে কোনও বিজ্ঞপ্তি নেই।
গালগলেশ

4
আপনি নিম্নলিখিত দুই লাইন যোগ করতে হবে .bashrc: . /usr/share/undistract-me/long-running.bash notify_when_long_running_commands_finish_install। এটি একটি বাগ বলে মনে হচ্ছে: github.com/jML/undistract-me/issues/23
লুডেন্টিকাস

32

আমি যতদূর বুঝতে পেরেছি আপনি একটি মোড়ক চাই । এবং আপনি এর মাধ্যমে একটি কমান্ড ব্যবহার করতে চান যাতে আপনার আদেশের চলমান সময় 15 সেকেন্ডের বেশি হলে এটি আপনাকে কাঙ্ক্ষিত বিজ্ঞপ্তি দেয় give সুতরাং এটি এখানে।

wrapper(){
    start=$(date +%s)
    "$@"
    [ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
 running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}

আপনার ~/.bashrcএবং উত্স ~/.bashrcহিসাবে এই ফাংশনটি অনুলিপি করুন ,

. ~/.bashrc

Useage

wrapper <your_command>

যদি এটি 15 সেকেন্ডের বেশি সময় নেয় তবে আপনি ডেস্কটপ-বিজ্ঞপ্তিটি কমান্ড এবং এর কার্যকর হওয়ার সময় বর্ণনা করতে পারবেন।

উদাহরণ

wrapper sudo apt-get update

ডেস্কটপ-নাইটিফিকেশন এর স্ক্রিনশট


1
"$@"না $@। বড় পার্থক্য.
গিরিহা

4
আমি wrapperটাইপ করা প্রতিটি কমান্ডের সামনে লেখা এড়াতে চাই ।
আইয়ুব

2
@ আইওউব আপনি একটি ছোট ফাংশন নাম ব্যবহার করতে পারেন এমনকি একটি চিঠিও হতে পারে। তবে একটি মোড়ক এই পদ্ধতিতে কাজ করে।
সৌরাভসি

3
command; alertআসলে wrapper command:-) থেকে খাটো
আইয়ুব

1
আপনি যদি notify-sendদীর্ঘ সময়ের জন্য মেয়াদ শেষ না করতে চান তবে একটি কাস্টম টাইমআউট (মিলিসেকেন্ডে) প্রেরণ করুন -কে দিন। যেমনnotify-send --expire-time 999999999 ...
ব্রাইস গিন্টা

26

এর ~/.bashrcমধ্যে একটি নাম alertসংজ্ঞায়িত করা আছে:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

যা কমান্ড প্রয়োগের সমাপ্তি সম্পর্কে অবহিত করতে ব্যবহৃত হতে পারে।

ব্যবহার:

$ the_command; alert

যেমন

$ sudo apt-get update; alert

snap1

আপনার প্রয়োজন এবং ইচ্ছা অনুযায়ী আপনি নিজের নামটি কাস্টমাইজ করতে পারেন।


3
এটা জেনে ভালো লাগল। আমি যে কমান্ডটি টাইপ করি তার পরে সতর্কতা যুক্ত করার কোনও উপায় আছে (এবং কমান্ডটি 15 সেকেন্ডের বেশি সময় নিলে কেবল এটির সতর্কতাও রয়েছে)?
আইয়ুব

এটি ইতিমধ্যে আমার .Bashrc- এ যুক্ত হয়ে গেছে, এটি উবুন্টুতে ডিফল্ট?
Vignesh

13

স্যুরভ্যাকের মতো একটি মোড়কের পরামর্শ ছাড়াও, ব্যাশে এটি করার কোনও ভাল উপায় নেই। আপনি একটি DEBUG ফাঁদ এবং একটি PROMPT_COMMAND দিয়ে তার চারপাশে হ্যাক করতে পারেন। আপনি যখনই কোনও কমান্ড চালান তখনই একটি DEBUG ট্র্যাপ ট্রিগার করা হয়, এবং প্রম্পট লেখার ঠিক আগে PROMPT_COMMAND চালানো হয়।

সুতরাং জন্য স্টাফ ~/.bashrcকিছু হয়ে যায়

trap '_start=$SECONDS' DEBUG
PROMPT_COMMAND='(if (( SECONDS - _start > 15 )); then notify-send "Long running command ended"; fi)'

এটি হ্যাক, তাই এর সাথে যদি আপনার অদ্ভুত পার্শ্ব প্রতিক্রিয়া দেখা দেয় তবে অবাক হবেন না।


4

সম্পাদনা

টিএল; ডিআর : স্বতঃসম্পূর্ণ শর্টকাট তৈরি করুন .inputrcএবং এতে কাজ করবে .bashrc । কমান্ডটি যথারীতি চালান, টাইপ করুন, তবে পরিবর্তে ENTER, আপনি যে শর্টকাটটি নির্দিষ্ট করেছেন তা টিপুন.inputrc

এই প্রশ্নে অনুগ্রহকারী ব্যক্তি বলেছিলেন:

"বিদ্যমান সমস্ত উত্তরের জন্য কমান্ডের পরে একটি অতিরিক্ত কমান্ড টাইপ করা দরকার I আমি এমন উত্তর চাই যা এটি স্বয়ংক্রিয়ভাবে ঘটে" "

এই সমস্যা আমি উপর পদস্খলিত করেছি সমাধান নিয়ে গবেষণা করার সময় এই stackexchange থেকে প্রশ্ন, যা বাঁধাই অনুমতি দেয় CtrlJক্রমানুসারে একাধিক কমান্ড হবে: Ctrlaকমান্ড আপনার লেখা সামনে স্থান "পরিমাপ" স্ট্রিং, (লাইন শুরুতে সরানো) Ctrlm(প্রতিপাদন করুন)

এইভাবে আপনি স্বয়ংক্রিয়ভাবে সমাপ্তির কার্যকারিতা এবং ENTERসময় পরিমাপের জন্য পৃথক কমান্ড পান, যখন দ্বিতীয় কার্যের মূল উদ্দেশ্যটি বজায় রেখে আমি বেলো পোস্ট করেছি।

এখন পর্যন্ত, এখানে আমার ~/.inputrcফাইলের বিষয়বস্তু রয়েছে :

"\C-j": "\C-a measure \C-m"

এবং এখানে লিখিত সামগ্রীগুলি রয়েছে .bashrc(দ্রষ্টব্য, আমি চিরতরে বাশ ব্যবহার করিনি - আমি আমার শেল হিসাবে ম্যাক্স ব্যবহার করি, সুতরাং এটিই আপনি মূল পোস্টে দেখেন Fun কার্যকারিতা এখনও একই)

PS1=' serg@ubuntu [$(pwd)]
================================
$ '
function measure () 
{

/usr/bin/time --output="/home/xieerqi/.timefile" -f "%e" $@ 

if [ $( cat ~/.timefile| cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

আসল পোস্ট

এখানে আমার ধারণা - একটি ফাংশন ব্যবহার করুন .bashrc। বেসিক নীতি - /usr/bin/timeকমান্ডটি সম্পূর্ণ হতে সময়টি পরিমাপ করতে ব্যবহার করুন এবং যদি এটি 15 সেকেন্ডের বেশি হয় তবে বিজ্ঞপ্তি প্রেরণ করুন।

function measure () 
{

if [ $( /usr/bin/time -f "%e" $@ 2>&1 >/dev/null ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

এখানে আমি আউটপুটটিকে পুনর্নির্দেশ করছি /dev/nullতবে আউটপুট দেখতে, ফাইলটিতে পুনঃনির্দেশও করা যেতে পারে।

আইএমএইচও, এর থেকে আরও ভাল পদ্ধতির হ'ল আপনার বাড়ির ফোল্ডারের কিছু ফাইলে সময়ের আউটপুট প্রেরণ করা (কেবল যাতে আপনি আপনার সিস্টেমকে টাইমফাইলে দূষিত করেন না এবং সর্বদা কোথায় সন্ধান করতে হয় তা জানতে পারেন)। এখানে দ্বিতীয় সংস্করণ

function measure () 
{

/usr/bin/time --output=~/.timefile -f "%e" $@ 

if [ $( cat ~/.timefile | cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

এবং এই ক্রমে প্রথম এবং দ্বিতীয় সংস্করণের স্ক্রিনশট এখানে

প্রথম সংস্করণ, কোনও আউটপুট নেই এখানে চিত্র বর্ণনা লিখুন

আউটপুট সহ দ্বিতীয় সংস্করণ এখানে চিত্র বর্ণনা লিখুন


যাইহোক, sudo কমান্ডগুলির সাথেও কাজ করে। আমি এটি পরীক্ষা করেছি sudo lsofএবং বেশিরভাগ সাথেই ping -c20 google.com
সের্গেই কোলোডিয়াজনি

3

আমি সম্প্রতি একটি সরঞ্জাম তৈরি করেছি যা এই উদ্দেশ্যে কাজ করে। এটি হয় একটি র‍্যাপার হিসাবে চালিত হতে পারে বা স্বয়ংক্রিয়ভাবে শেল ইন্টিগ্রেশন সহ চালানো যেতে পারে। এটি এখানে দেখুন: http://ntfy.rtfd.io

এটি ইনস্টল করতে:

sudo pip install ntfy

এটি একটি মোড়ক হিসাবে ব্যবহার করতে:

ntfy done sleep 3

বিজ্ঞপ্তিগুলি স্বয়ংক্রিয়ভাবে পেতে, এটি আপনার .bashrcবা .zshrc:

eval "$(ntfy shell-integration)"

1

আপনার স্ক্রিপ্টটি বেশ ভালভাবে কাজ করে, কেবলমাত্র নিশ্চিত করুন যে আপনি 'শেবাং' ( #!/bin/bash) লাইনটি অন্তর্ভুক্ত করেছেন । এখানে#!/bin/bash উল্লেখ করার মতো অন্যগুলি , তবে বেশিরভাগ সময় ইউনিক্স ব্যাশ স্ক্রিপ্টগুলির জন্য দুর্দান্ত কাজ করে। এটি স্ক্রিপ্ট ইন্টারপ্রেটার দ্বারা প্রয়োজনীয় তাই এটি কী ধরণের স্ক্রিপ্ট তা জানে।#!/bin/bash

এটি টেস্ট স্ক্রিপ্ট হিসাবে কাজ করছে বলে মনে হচ্ছে:

#!/bin/bash
start=$(date +%s);
   echo Started
   sleep 20;
   echo Finished!
[ $(($(date +%s) - start)) -le 15 ] || notify-send -i dialog-warning-symbolic "Header" "Message"

এই স্ক্রিপ্টটি সংশোধন করতে, লাইন echoএবং sleepলাইনগুলি কমান্ড (গুলি) করুন ।

এর সাথে নোট করুন notify-send, আপনি -iএকটি আইকন নির্দিষ্ট করতেও ব্যবহার করতে পারেন :-)

এছাড়াও, নিশ্চিত হয়ে নিন যে chmod +x /PATH/TO/FILEএটি প্রথমে চালিয়ে কার্যকর করা যায়।


1

আপনি চাইলে মোড়কের কার্যকারিতা বাস্তবায়নের জন্য আপনি বাশকে পরিবর্তন করতে পারেন।

আপনি যদি আপনার ইন্টারেক্টিভ শেলটিতে এ জাতীয় অনেকগুলি পরিবর্তন করতে আগ্রহী হন তবে আপনি এসেল এর মতো একটি অভ্যন্তরীণভাবে হ্যাকযোগ্য শেলটি স্যুইচ করার বিষয়টি বিবেচনা করতে পারেন, যা ইমাস এলিস্প ব্যবহার করে নির্মিত হয়েছে এবং এর সমস্ত তলীয় অনুকূলিতকরণ রয়েছে:

http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/


-2

আপনি যদি এই জাতীয় বিবৃতিতে সরল সাথে এটি করতে পারেন

#!/bin/bash

START=$(date +%s)

TIME=$(($START+15))

ORIGINAL_COMMAND;

END=$(date +%s)

if [ $END -gt $TIME ]
then
    notify-send "Task Completed"
fi

আপনি নিজের ভেরিয়েবলের নাম ব্যবহার করতে পারেন।

আমি নিশ্চিত করতে পারি যে এটি কাজ করে, আমি একটি কমান্ড দিয়ে পরীক্ষা করেছিলাম যা শেষ করতে দীর্ঘ সময় নেয় এবং এটি না হয় এবং একটি বিজ্ঞপ্তি আসে যাতে দীর্ঘ সময় লাগে

এছাড়াও আপনি প্রতিস্থাপন করে যে কোনো আদেশের সঙ্গে এটা করতে পারেন ORIGINAL_COMMANDসঙ্গে $@এবং স্ক্রিপ্ট চালাতে ./script command


আমার উত্তরটি কেন নিম্নমানের ছিল? আমি জানতে চাই যে উত্তরে আমি কোথায় ভুল করেছি
রুমেশ

আমি এটিকে ডাউনভোট করি নি, তবে এর সাথে কী হয়েছে তা আমি আপনাকে জানিয়ে দেব: প্রথমত, এটির জন্য একটি অতিরিক্ত কমান্ড টাইপ করা দরকার। আমি আমার অনুগ্রহে বিশেষত বলেছি যে আমি এটি করতে চাই না। দ্বিতীয়ত, ক্যালক? $((2+2))বাশ অন্তর্নির্মিত, কোনও অতিরিক্ত প্রোগ্রামের প্রয়োজন নেই। তৃতীয়: এটি কমান্ডগুলির সাথে কাজ করে না যেখানে স্পেস রয়েছে। tl; dr: এটি 1 বছরের পুরানো উত্তরগুলির চেয়ে খারাপ
গ্যালগলেশ

আচ্ছা ..... সবসময় শুরু এবং শেষ সময় আলাদা হবে, তাই না? এমনকি একটি ছোট কমান্ড যে 1second দীর্ঘ
Sergiy Kolodyazhnyy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.