সমস্ত ভার্চুয়ালবক্স (যোজনাগুলি) ভিএম-কে এক সহজে ব্যাশ কমান্ড ব্যবহার করতে বন্ধ করা (এটি একটি ব্যাশ ফাইলে রাখা যেতে পারে)


70

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

কমান্ডলাইন-ফু দিয়ে বিভক্ত সমস্ত বাক্সের কাছাকাছি স্ক্রিপ্ট করার কোনও উপায় থাকতে পারে? নিম্নলিখিত মত কিছু, কিন্তু কিছু, ভাল, কাজ করে।

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;

আমি ভ্যাগ্র্যান্ট জানি না তবে এটি ভার্চুয়ালবক্সের সাথে নয়, ভিএমওয়্যারের সাথে লিঙ্কযুক্ত বলে মনে হচ্ছে। আপনি কি আসলে ভার্চুয়ালবক্স ব্যবহার করছেন?
terdon

@ এটারডন: ভ্যাগ্র্যান্ট প্রাথমিকভাবে কেবল ভক্সকে সমর্থন করে। আমার মনে হয় তারা এখন অন্য ধরণের ভিএম ফর্ম্যাটকে সমর্থন করে (ভিএমওয়্যার বুঝতে)
সিলভাইন পাইনাউ

পছন্দ করুন আমি কেবল তাদের ওয়েবপৃষ্ঠায় এক ঝলক পেয়েছি এবং একটি "ভিএমওয়্যার ইন্টিগ্রেশন" লিঙ্কটি দেখেছি এবং ধরে নিয়েছি ass স্পষ্টির জন্য ধন্যবাদ।
terdon

1
আমি এই স্ক্রিপ্ট একবার দেখুন । সম্পূর্ণ ব্লগ পোস্ট এখানে । পরীক্ষা করা হয়নি
সিলভাইন পাইনাউ

রিচার্ড দয়া করে আপনার প্রশ্নের উত্তর সম্পাদনা করবেন না। আপনি পৃথক উত্তরে আপনার নিজের প্রশ্নের উত্তর দিতে নির্দ্বিধায়। আমি আপনাকে একটি ভাল প্রশ্নের উত্তোলন দিয়েছি।
don.joey

উত্তর:


91

ভার্চুয়াল বক্স মেশিনগুলির স্ক্রিপ্টযোগ্য নিয়ন্ত্রণের জন্য আমরা VBoxManage কমান্ড ব্যবহার করতে পারি :

  • চলমান মেশিনগুলির তালিকা (রিটার্নের নাম এবং ইউইউডি):

    VBoxManage list runningvms
    
  • ভিএমগুলি "হাইবারনেট" করে চালানো বন্ধ করুন (ডেটা ক্ষতি এড়াতে প্রস্তাবিত)

    VBoxManage controlvm <name|uuid> savestate
    
  • পাওয়ার অফ চলমান ভিএম (প্রস্তাবিত নয় কারণ আমরা অতিথির ডেটা হারাতে পারি)

    VBoxManage controlvm <name|uuid> poweroff
    
  • এসিপিআই-সচেতন অতিথি ওএসে এসিপিআই ব্যবহার করুন ( poweroffঅতিথিদের প্রশংসনীয় শাটডাউন করার পক্ষে ভাল )

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

আরও দেখুন: কমান্ড লাইন ব্যবহার করে ভার্চুয়ালবক্সে অতিথি ওএসকে কীভাবে নিরাপদে শাটডাউন করবেন

ওপি থেকে আপডেট

নীচে এই নির্বাচিত সঠিক উত্তরের ভিত্তিতে, আমি এই বাশ স্ক্রিপ্ট " $HOME/bin/stop-vagrant.sh" যুক্ত করেছি । সুতরাং এখন আমার কাছে এমন কিছু আছে যা নিরাপদে সমস্ত অসম্পূর্ণ ভিএম বন্ধ করা শুরু করতে পারে যা আমি সম্ভবত একটি সেশনে ভুলে গিয়েছি।

vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} savestate

কমান্ড ব্যাখ্যা:

vboxmanage list runningvms | - ভার্চুয়ালবক্সের অধীনে চলছে সমস্ত চলমান ভিএমএসের একটি তালিকা

sed -r 's/.*\{(.*)\}/\1/' | - স্ট্রিংটি আইডি নম্বরে নামিয়ে দেয়

xargs -L1 -I {} VBoxManage controlvm {} savestate - খোলা প্রতিটি বাক্সে সেভ স্টেট কমান্ড চালায়।

উপর xargs

  • -L1 - একবারে একটি লাইন নিন
  • -I {} - পরবর্তী কমান্ডের জন্য স্থানধারক হিসাবে {uses ব্যবহার করে

হু হু! উপরোক্ত পরামর্শ দেওয়া, এই কমান্ড লাইনটি যাদু কাজ করে: vboxmanage list runvms | sed -r 's /.* \ {(। *) \} / \ 1 /' | xargs -L1 -I {B VBoxManage controlvm} vest সভেস্টেট
রিক

1
দ্রষ্টব্য, -rবিকল্পটি জিএনইউ শেডের জন্য অনন্য।
জর্জ ভি। রিলি

আমি দেখেছি সেরা জাদুকরী ওয়ান-লাইনার! সাবাশ! : D
tftd

1
ওএসএক্স / ম্যাকোস এ আপনার -Eপরিবর্তে ব্যবহার করতে হবে -r। এটি বর্ধিত নিয়মিত অভিব্যক্তি ব্যবহারের জন্য পতাকা।
জয়ডি

22

অন্য উত্তর ভার্চুয়ালবক্স পরিচালনা করার জন্য দুর্দান্ত, তবে ভার্চুয়াল ভার্চুয়াল মেশিনগুলি পরিচালনা করার জন্য নিজস্ব ব্যবস্থাগুলি বৈশিষ্ট্যযুক্ত এবং একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে, এটি এই মুহূর্তে কেবল ভার্চুয়ালবক্সের চেয়ে বেশি সমর্থন করে, তবে কে পরে জানে!

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

vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend

বিঃদ্রঃ:

এটি 1.6 এর পরে ভ্যাগ্র্যান্ট সংস্করণগুলির সাথে কাজ করে, পুরানো সংস্করণগুলির জন্য আপনার সম্ভবত আপগ্রেড করা উচিত তবে আপনি যদি এটি না করতে পারেন তবে ভার্চুয়ালবক্সকে কেন্দ্র করে অন্য বিকল্পগুলির মধ্যে একটি আরও ভাল হতে পারে।


4
এটি অবশ্যই অনেক সংশোধনকারী (টিএম) উত্তর। @ রিচার্ডের পরিবর্তে এটি গ্রহণ করার কথা বিবেচনা করা উচিত
hed

global-statusকমান্ড ছিল দ্য ভাগ্রান্ট 1.6 চালু । ভ্যাগ্র্যান্টের পুরানো সংস্করণগুলির ব্যবহারকারীরা, বিশেষত যারা এটির মাধ্যমে ইনস্টল করেছেন apt-getএবং এখনও 1.4.3 এ থাকতে পারে তাদের এই কমান্ডটি ব্যবহার করার আগে তাদের ভ্যাগ্র্যান্ট ইনস্টল আপডেট করতে হবে।
কার্টিস গিবি

1
বাসদ xargsসমর্থন করে না -r, অতএব আপনি ইনস্টল করতে পারেন gxargsমাধ্যমে brewএবং এর পরিবর্তে এটি ব্যবহার।
কেনারব

11

এর জন্য আমার পদ্ধতি:

vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;

  • গ্লোবাল-স্ট্যাটাস সমস্ত বক্সের তালিকা করে
  • ফিল্টার করে এতে থাকা লাইনের জন্য virtualbox(যদি আপনি অন্য কোনও সরবরাহকারীর ব্যবহার করছেন তবে সাহায্যের পাঠ্যটি ছাঁটাই করে ফেলবে)
  • প্রথম 9 টি অক্ষর প্রদর্শন করার জন্য ফিল্টার করুন (গ্লোবাল অনন্য আইডি)
  • আমরা এখনও সেই ইনপুট থেকে একটি লাইন পড়তে পারি, ততক্ষণে ভেরিয়েবল $ লাইন হিসাবে এটি পড়ি:
    • $ লাইনটি মুদ্রণ করুন
    • চালানো vagrant halt $lineবিশ্বব্যাপী অনন্য ID- র জন্য ভবঘুরে স্থগিত

এটি উপরের ভার্চুয়ালবক্স পদ্ধতির চেয়ে ভাল, কারণ এটি যে কোনও যান্ত্রিক-কনফিগার করা শাটডাউন প্রক্রিয়াও চালাবে।


3
এই কমান্ডটি ওএস এক্স হোস্টের জন্যও কাজ করে। অন্যরা OSX ও লিনাক্স সংস্করণের মধ্যে হ্যান্ডলিং কমান্ড লাইন আর্গুমেন্ট পার্থক্য কারণে ব্যর্থ sedএবং awk। ধন্যবাদ!
অ্যান্ড্রু Листочкин Листочкин

@ অ্যান্ড্রুАндрейЛисточкин কনফার্ম - ওএস এক্স 10 তে ভাল কাজ করে। যদিও অন্য OS এ পরীক্ষিত হয় না।
setevoy

2
উপরের কমান্ডটি সমস্ত বাক্স বন্ধ করার চেষ্টা করে, চলমান আছে কি না তা নির্বিশেষে, কার্যকর করতে দীর্ঘ সময় নেয়। আমার জন্য, আমি যেমন কেবল ভার্চুয়ালবক্স ব্যবহার করি, কেবল চালিতগুলি পেতে আমি "ভার্চুয়ালবক্স" গ্রেপকে "চলমান" তে পরিবর্তন করেছি।
অ্যালেক্স 2 পিএফ

এটি একটি ভাল উত্তর, তবে আপনি রাজ্যটি সংরক্ষণ করার vagrant suspendপরিবর্তে ব্যবহার vagrant haltকরতে এবং দ্রুত এবং নিচে আপের জন্য স্থগিত করতে পছন্দ করতে পারেন ।
ডেভিড থমাস

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

5

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

# Contents of /etc/default/virtualbox
# ...
# ...
# SHUTDOWN_USERS="foo bar"  
#   check for running VMs of user 'foo' and user 'bar'
#   'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
#   select one of these shutdown methods for running VMs
#   acpibutton and savestate causes the init script to wait
#   30 seconds for the VMs to shutdown

## My original values
# SHUTDOWN_USERS=""
# SHUTDOWN=poweroff

## My current values
SHUTDOWN_USERS="all"
SHUTDOWN=savestate

উল্টোটি হ'ল init.dঅন্যান্য উত্তরে পোস্ট হওয়া কমান্ডগুলি চালানোর জন্য কোনও লগআউট বা স্ট্রিপ সম্পাদনা / তৈরি করা প্রয়োজন হয় না । ক্ষতিটি হ'ল এই সমাধানটি ভার্চুয়ালবক্সের সাথে নির্দিষ্ট।

ভার্চুয়ালবক্স 4.3.18 এর সাথে উবুন্টু 14.10 তে পরীক্ষা করা হয়েছে।

সমস্ত ক্রেডিট এই পোস্টে যায় ।


5

অন্যান্য কয়েকটি উত্তরের সংমিশ্রণ, এটি চলমান ভার্চুয়ালবক্স ভিজাগর বাক্সগুলি বন্ধ করে দেবে:

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt

এটি আমার পক্ষে কাজ করেছিল!
ডায়রন গ্যালার্ডো 31'18

3

আমি শুধু ব্যবহার vagrant halt। আপনি যদি আরও যুক্তি ছাড়াই এটি চালনা করেন তবে এটিতে সংজ্ঞায়িত সমস্ত মেশিন বন্ধ করে দেয় Vagrantfile


1

আপনি যদি ভ্যাগ্র্যান্ট কমান্ডগুলি পার্স করার জন্য স্ক্রিপ্ট লিখছেন, তবে এটি মেশিন-বান্ধব আউটপুট ( --machine-readable) আরও পারস্পরিকভাবে পার্স করার পরামর্শ দেয় to

বিন্যাসটি হ'ল:

timestamp,target,type,data...

সুতরাং আপনি এটিকে CSV ফাইল হিসাবে আমদানি করতে পারবেন, কারণ এটি কমা-বিচ্ছিন্ন।

শেল দিয়ে, সম্ভবত এটি পার্স করা আরও কঠিন, উদাহরণস্বরূপ:

for id in $(vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o "[0-9a-f]{7}"); do
    vagrant suspend $id;
done

দেখুন: ভ্যাগ্রান্ট - মেশিন রিডে আউটপুট


তবে আমি স্ট্যান্ডার্ড আউটপুটকে পার্স করা সহজ মনে করি, যেমন

while read id name provider state path; do
  [ "$state" = "running" ] && vagrant suspend $id;
done < <(vagrant global-status)

BTW। তাত্ত্বিকভাবে vagrantকমান্ডের এই জিএইচ পোস্ট অনুসারে স্থগিত করার জন্য ভিএমগুলির তালিকার জন্য একটি নিয়মিত অভিব্যক্তি গ্রহণ করা উচিত , উদাহরণস্বরূপ:

vagrant suspend '*'

তবে এটি কাজ করে না এবং এখানে একটি বাগ # 7221 রয়েছে যা এটি ঠিক করার জন্য মুলতুবি রয়েছে।


সম্পর্কিত গিটহাবের টিকিট:


0

এটি আপনার পক্ষে কাজ নাও করতে পারে ;-) আমার জন্য কাজ করে

vagrant_halt_all.sh

#!/usr/bin/env bash
if [ -z "$1" ]
then
  OPTS=""
else
  # force close if any arg passed
  OPTS="-f"
fi

for i in $(vagrant global-status | grep running | awk '{print $1}'); do 
  DIR=$(vagrant global-status | grep running | awk '{print $5}')
  cd "$DIR";
  OUT=$(vagrant halt);
  echo "attempted to halt $i: $OUT"
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.