ইতিমধ্যে একটি চলমান, বিদ্যমান একটি সমাপ্তির পরে কমান্ড কীভাবে চালানো যায়?


32

যদি আমি কোনও স্ক্রিপ্ট শুরু করি যা দীর্ঘ সময় নিতে চলেছে, আমি স্ক্রিপ্টটি শুরু করার পরে অবশ্যম্ভাবীভাবে এটি উপলব্ধি করতে পারি এবং আশা করি এটি শেষ হয়ে গেলে আমার কোনও ধরণের সতর্কতা করার উপায় ছিল।

সুতরাং, উদাহরণস্বরূপ, যদি আমি চালাই:

really_long_script.sh

এবং এন্টার টিপুন ... অন্য কমান্ডটি শেষ হয়ে গেলে কীভাবে চালাব?

উত্তর:


45

আপনি একাধিক কমান্ড দ্বারা পৃথক করতে পারেন ;, সুতরাং সেগুলি ক্রমিকভাবে কার্যকর করা হয়, উদাহরণস্বরূপ:

really_long_script.sh ; echo Finished

আপনি যদি পরবর্তী প্রোগ্রামটি সম্পাদন করতে চান তবে স্ক্রিপ্টটি যদি রিটার্ন-কোড 0 দিয়ে শেষ হয় (যার অর্থ সাধারণত এটি সঠিকভাবে কার্যকর হয়েছে) তবে:

really_long_script.sh && echo OK

আপনি যদি এর বিপরীতে চান (যেমন চলমান কমান্ড ব্যর্থ হয়েছে কেবল তখনই চালিয়ে যান), এর চেয়ে:

really_long_script.sh || echo FAILED

আপনি আপনার স্ক্রিপ্টটি একটি পটভূমিতে চালাতে পারেন (তবে সাবধান, স্ক্রিপ্ট আউটপুট ( stdoutএবং stderr) আপনার টার্মিনালে আপনি অন্য কোথা থেকে পুনঃনির্দেশ না করাতে চালিয়ে যেতে পারবেন)) এবং তারপরে wait:

really_long_script.sh &
dosomethingelse
wait; echo Finished

আপনার যদি ইতিমধ্যে স্ক্রিপ্টটি চালানো থাকে তবে আপনি এটিটির সাথে স্থগিত করতে পারেন Ctrl-Z, এবং তারপরে এমন কিছু কার্যকর করতে পারেন:

fg ; echo Finished

fgস্থগিত প্রক্রিয়াটি যেখানে অগ্রণী পৃষ্ঠায় নিয়ে আসে ( bgএটি পটভূমিতে চলতে শুরু করবে, প্রায় শুরু করার মতো &)


@mlissner এই ক্ষেত্রে আবরণ আমার উত্তর প্রসারিত
এল্যান্ড

8
যেহেতু fgপুনরায় কাজ শুরু হয় তার মানটি যেহেতু প্রত্যাবর্তন করে তাই fg && echo Finishedআপনি অন্য কমান্ড কার্যকর করার আগে কমান্ডটি সফল হয়েছে তা নিশ্চিত করতে চাইলে আপনি ব্যবহার করতে পারেন ।
পালসউইম

13

আপনি বাশের কাজের নিয়ন্ত্রণও ব্যবহার করতে পারেন। আপনি যদি শুরু করেন

$ really_long_script.sh

তারপরে এটি স্থগিত করতে ctrl + z টিপুন:

^Z
[1]+  Stopped                 really_long_script.sh
$ bg

পটভূমিতে কাজটি পুনঃসূচনা করতে (ঠিক যেমন এটি দিয়ে শুরু হয়েছিল really_long_script.sh &)। তারপরে আপনি এই ব্যাকগ্রাউন্ড কাজের জন্য অপেক্ষা করতে পারেন

$ wait N && echo "Successfully completed"

যেখানে এন হ'ল জব আইডি (সম্ভবত আপনি যদি অন্য কোনও পটভূমি কাজ চালিত না হন) যা [1]উপরের মত প্রদর্শিত হয় ।


11

যদি প্রক্রিয়াটি বর্তমান টিটিটিতে না চলে, তবে এটি চেষ্টা করে দেখুন:

watch -g ps -opid -p <pid>; mycommand

2
আমি সৃজনশীল ব্যবহার পছন্দ করি watch। সুপার সংক্ষিপ্ত উত্তর এবং একটি ওয়াচ ব্যবহারের একটি নতুন দরকারী উপায় শিখেছে
পাইওটর সিজাপলা

2

দেখা যাচ্ছে এটি তেমন শক্ত নয়: আপনি বিদ্যমান কমান্ডটি চালানোর সময় উইন্ডোতে কেবল পরবর্তী কমান্ডটি টাইপ করতে পারেন, এন্টার টিপুন এবং প্রথমটি শেষ হয়ে গেলে দ্বিতীয় কমান্ডটি স্বয়ংক্রিয়ভাবে চলবে।

আমি অনুমান করছি যে আরও মার্জিত উপায় আছে তবে এটি কার্যকর হবে বলে মনে হচ্ছে না।

কমান্ডটি শেষ হওয়ার পরে আপনি যদি একটি সতর্কতা চালাতে চান তবে এটি সম্পাদনা করে আপনি .bashrc এ এই উপমাগুলি তৈরি করতে পারেন, তারপরে alertএটি চলমান অবস্থায় চালনা করুন:

 alias alert_helper='history|tail -n1|sed -e "s/^\s*[0-9]\+\s*//" -e "s/;\s*alert$//"'
 alias alert='notify-send -i gnome-terminal "Finished Terminal Job" "[$?] $(alert_helper)"'

7
চলমান স্ক্রিপ্টটি যদি না এক পর্যায়ে ইনপুট আশা করে।
ড্যানিয়েল বেক

@ ড্যানিয়েল - হ্যাঁ ... এটি একটি সমস্যা। অঙ্কুর।
mlissner

1

কিছুক্ষণ আগে আমি অন্য প্রক্রিয়া শেষ হওয়ার অপেক্ষার জন্য একটি স্ক্রিপ্ট লিখেছি। প্রদত্ত যে সঠিকভাবে সেট করা আছে NOISE_CMDমত কিছু হতে পারে ।notify-send ...DISPLAY

#!/bin/bash

NOISE_CMD="/usr/bin/mplayer -really-quiet $HOME/sfx/alarm-clock.mp3"

function usage() {
    echo "Usage: $(basename "$0") [ PROCESS_NAME [ PGREP_ARGS... ] ]"
    echo "Helpful arguments to pgrep are: -f -n -o -x"
}

if [ "$#" -gt 0 ] ; then
    PATTERN="$1"
    shift
    PIDS="$(pgrep "$PATTERN" "$@")"

    if [ -z "$PIDS" ] ; then
        echo "No process matching pattern \"$PATTERN\" found."
        exit
    fi

    echo "Waiting for:"
    pgrep -l "$PATTERN" "$@"

    for PID in $PIDS ; do
        while [ -d "/proc/$PID" ] ; do
            sleep 1
        done
    done
fi

exec $NOISE_CMD

কোনও বিতর্ক ছাড়াই, অবিলম্বে কিছুটা শব্দ করুন। এই আচরণটি সুবিধার জন্য এই জাতীয় কিছুটিকে মঞ্জুরি দেয় (বলুন যে আপনি নীচে স্ক্রিপ্ট কল করেন alarm.sh):

apt-get upgrade ; ~/bin/alarm.sh

অবশ্যই আপনি এই জাতীয় স্ক্রিপ্ট সহ অনেক মজার কাজ করতে পারেন, যেমন কোনও উদাহরণের জন্য alarm.shঅপেক্ষা করার উদাহরণ দেওয়া alarm.sh, এটি অন্য কোনও কমান্ডের অপেক্ষায়। অথবা অন্য কোনও লগ ইন করা ব্যবহারকারীর কিছু কাজ সমাপ্ত করার ঠিক পরে একটি কমান্ড কার্যকর করা ...>: ডি

উপরের স্ক্রিপ্টটির একটি পূর্ববর্তী সংস্করণ আকর্ষণীয় হতে পারে, যদি আপনি pgrepনিজের উপর নির্ভরতা এড়াতে চান এবং নিজেকে নিজেই প্রসেস আইডি অনুসন্ধান করতে চান :

#!/bin/bash

if [ "$#" -lt 2 -o ! -d "/proc/$1" ] ; then
  echo "Usage: $(basename "$0") PID COMMAND [ ARGUMENTS... ]"
  exit
fi

while [ -d "/proc/$1" ] ; do
  sleep 1
done

shift
exec "$@"

সামান্য সামান্য অফ-টপিক, তবে অনুরূপ পরিস্থিতিতে কার্যকর: কারও মধ্যে আগ্রহী হতে পারে reptyr, এমন একটি সরঞ্জাম যা কিছু (পিতামাতার) শেল থেকে একটি প্রক্রিয়া "চুরি" করে এবং এটি বর্তমান শেল থেকে চালায়। আমি অনুরূপ বাস্তবায়ন চেষ্টা করেছি এবং reptyrআমার উদ্দেশ্যগুলির জন্য সবচেয়ে সুন্দর এবং সবচেয়ে নির্ভরযোগ্য।

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