শেল স্ক্রিপ্টে, আমি কীভাবে (1) পটভূমিতে একটি কমান্ড শুরু করতে পারি (2) x সেকেন্ড অপেক্ষা করি (3) সেই কমান্ডটি চলমান অবস্থায় একটি দ্বিতীয় কমান্ড চালাতে পারে?


11

এটিই আমার ঘটতে হবে:

  1. পটভূমিতে একটি প্রক্রিয়া শুরু করুন
  2. এক্স সেকেন্ডের জন্য অপেক্ষা করুন
  3. অগ্রভাগে প্রক্রিয়া বি শুরু করুন

আমি কীভাবে অপেক্ষা করতে পারি?

আমি দেখছি যে 'ঘুম' সমস্ত কিছু বন্ধ হয়ে গেছে বলে মনে হচ্ছে এবং প্রক্রিয়া A সম্পূর্ণরূপে শেষ হওয়ার জন্য আমি আসলে 'অপেক্ষা' করতে চাই না। আমি কিছু সময়ভিত্তিক লুপগুলি দেখেছি তবে আমি আরও পরিষ্কার করছি যে আমি কিছু ভাবছি।


4
আমি আপনাকে পরামর্শ দিয়েছি যে আপনি ইতিমধ্যে যা চেষ্টা করেছেন তার একটি সাধারণ উদাহরণ সরবরাহ করে আপনি এই প্রশ্নটি বাড়িয়ে তোলেন।
অ্যান্ডি ডাল্টন

10
sleepপ্রক্রিয়া-এ বন্ধ করে দেয় এমন ছাপ আপনি কোথায় পাবেন ? আপনি যে পরীক্ষার প্রক্রিয়াটি ব্যবহার করছেন, বা এর আউটপুট সূচকটি প্রদর্শন করতে পারেন? প্রক্রিয়া-এ যদি থামছে তবে সম্ভবত যে কোনও বিষয় সম্পর্কিত নয় বরং ব্যাকগ্রাউন্ডে চলার সময় এবং টার্মিনাল থেকে পড়ার চেষ্টা করা হচ্ছে sleep
চার্লস ডাফি 16

3
... যদি এটি হয় তবে process_a </dev/null &টিটিওয়াইয়ের /dev/nullপরিবর্তে এর স্টিডিন সংযুক্ত করবে এবং সমস্যা এড়াতে এটি যথেষ্ট হতে পারে।
চার্লস ডাফি 16

আমার অভিজ্ঞতা থেকে ঘুম শুধুমাত্র বর্তমান প্রক্রিয়া অবরুদ্ধ করবে এবং এইভাবে না প্রক্রিয়া আগে যাদের সাথে ব্যাকগ্রাউন্ডে শুরু করুন &
MADforFUNandHappy

উত্তর:


28

আমি আপনার প্রশ্নের ভুল বোঝাবুঝি না হলে এটি এই শর্ট স্ক্রিপ্টের সাহায্যে অর্জন করা যেতে পারে:

#!/bin/bash

process_a &
sleep x
process_b

(এবং waitশেষে process_aবেরোনোর ​​আগে আপনার স্ক্রিপ্টটি শেষ হওয়ার অপেক্ষা করাতে চাইলে অতিরিক্ত অতিরিক্ত যুক্ত করুন )।

এমনকি স্ক্রিপ্টের প্রয়োজন ছাড়াই আপনি ওয়ান-লাইনার হিসাবে এটি করতে পারেন (@ বার্ডকপ্পেরডের পরামর্শ অনুসারে):

process_a & sleep x ; process_b

6
মনে রাখবেন যে এর bashজন্য আপনার কোনও প্রয়োজন নেই , কোনও শেল আপনার সিস্টেমে অন্তর্ভুক্ত করবে sh, সুতরাং আপনার স্ক্রিপ্টের জন্য আপনার বাশের উপর নির্ভরতা যুক্ত করার দরকার নেই।
স্টাফেন চেজেলাস

4
বা সহজভাবে: প্রক্রিয়া_এ & স্লিপ এক্স; প্রক্রিয়া_বি
বার্ড কোপ্পেরুদ

9

আপনি ব্যাকগ্রাউন্ডে কোনও প্রক্রিয়া চালাতে ব্যাকগ্রাউন্ড কন্ট্রোল অপারেটর (&) এবং দ্বিতীয় প্রক্রিয়া চালানোর আগে অপেক্ষা করার sleepকমান্ডটি ব্যবহার করতে পারেন , যেমন:

#!/usr/bin/env bash
# script.sh

command1 &
sleep x
command2

এখানে দুটি কমান্ডের উদাহরণ যা কিছু সময়-স্ট্যাম্পযুক্ত বার্তা প্রিন্ট করে:

#!/usr/bin/env bash

# Execute a process in the background
echo "$(date) - Running first process in the background..."
for i in {1..1000}; do
    echo "$(date) - I am running in the background";
    sleep 1;
done &> background-process-output.txt &

# Wait for 5 seconds
echo "$(date) - Sleeping..."
sleep 5 

# Execute a second process in the foreground
echo "$(date) - Running second process in the foreground..."
for i in {1..1000}; do
    echo "$(date) - I am running in the foreground";
    sleep 1;
done

এটি পছন্দসই আচরণ প্রদর্শন করে তা যাচাই করতে এটি চালান:

user@host:~$ bash script.sh

Fri Dec  1 13:41:10 CST 2017 - Running first process in the background...
Fri Dec  1 13:41:10 CST 2017 - Sleeping...
Fri Dec  1 13:41:15 CST 2017 - Running second process in the foreground...
Fri Dec  1 13:41:15 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:16 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:17 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:18 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:19 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:20 CST 2017 - I am running in the foreground
...
...
...

2
প্রশ্নটি " অগ্রভাগে বি বি প্রক্রিয়া শুরু করতে" জিজ্ঞাসা করে ।
স্পারহাক

1
পছন্দ করুন সম্পূর্ণরূপে এটি অপ্রকাশিত - কোনও ব্যাখ্যা নেই। মাথা আপ করার জন্য ধন্যবাদ - কোড সংশোধন করা হয়েছে। আপনার ব্যবহারকারীর নাম, বিটিডব্লিউ থেকে গুরুতর নস্টালজিয়া।
igal

1
কোন চিন্তা করো না! (এছাড়াও ব্যবহারকারীর নামটি মূলত এই চ্যাপটির একটি উল্লেখ ছিল , তবে আমি কেবল পরে বুঝতে পারি এটি একটি এডিংস চরিত্র! এবং আমাকে সেই বইগুলি পুনরায় পড়তে চায় ...)
স্পারহাক

5

আমি @ dr01 এর উত্তরটি পছন্দ করি তবে তিনি প্রস্থান কোডটি পরীক্ষা করে না এবং তাই আপনি জানেন না আপনি সফল হয়েছেন কি না।

এক্সিকোডগুলি পরীক্ষা করে এমন একটি সমাধান এখানে দেওয়া হয়েছে।

#!/bin/bash

# run processes
process_a &
PID1=$!
sleep x
process_b &
PID2=$!
exitcode=0

# check the exitcode for process A
wait $PID1    
if (($? != 0)); then
    echo "ERROR: process_a exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi

# check the exitcode for process B
wait $PID2
if (($? != 0)); then
    echo "ERROR: process_b exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi
exit ${exitcode}

সাধারণত আমি একটি ব্যাশ অ্যারে পিআইডি সঞ্চয় করি এবং তারপরে পিড চেকিং লুপের জন্য is


2
আপনি আপনার স্ক্রিপ্টের প্রস্থান স্থিতিতে এই প্রস্থানকারী কোডগুলি A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
প্রতিবিম্বিত করতে

1
@ স্টাফেনচেজেলাস ভাল ধারণা। আমি কোড আপডেট করেছিলাম তা নিশ্চিত করতে কোডটি আপডেট করে একটি বা দু'জনেই ব্যর্থ হলে কোনও শূন্য-বহিরাগত এক্সিকোড ফিরে এসেছে।
ট্রেভর বয়েড স্মিথ

ওপি process_bঅগ্রভাগে চলমান চায় । সম্ভবত process_aযখন থেকে প্রস্থান পারে process_bচলছে, কিন্তু আপনি এখনও করতে পারেন waitতার জন্য ও পরে আপনি ফোরগ্রাউন্ড প্রদর্শন করে প্রস্থান অবস্থা সংগ্রহ করেছি প্রস্থান অবস্থা process_bসাথে স্বাভাবিক ভাবে, $?সরাসরি।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.