virt-manager وقتی از ترمینال فراخوانی میشه، پنجره مورد نظر رو باز میکنه و بعد هم
توی ترمینال دستور خاتمه پیدا میکنه. پس اون چیزی که گفتید کار نمیکنه. چون بعد که virt-manager اجرا شد، کامپیوتر خاموش میشه.
اگه اینجوری بود که تا وقتی پنجره virt-manager باز هست، دستور توی ترمینال هم در حال اجرا باشه، میشد. ولی حالا نیست و نمیشه.
ببخشید، در صورت امکان میخواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.
برای خاموش کردن ایده خوبی دادید ولی چیزی که نوشتید مشکل داشت. این رو ببینید:
VAR="$(pgrep qemu-system-x86)"
if [ -z "$VAR" ]; then
poweroff
fi
برای این از "" استفاده شده تا خروجی به عنوان رشته (استرینگ) به حساب بیاد. در حالت معمول هم باید اینطور بشه ولی اگه توی خروجی pgrep فاصله وجود داشته باشه، میتونه داخل if مشکلساز بشه.
این اول pid که مربوط qemu-system-x86 هست رو پیدا میکنه و داخل متغیر VAR قرار میده. اگه پردازشی (پروسه) با این اسم وجود داشته باشه، مقدار متغیر VAR برابر pid اون پردازش قرار میگیره. اگه پردازشی به این اسم وجود نداشته باشه، مقداری داخل متغیر VAR قرار نمیگیره و به اصطلاح، مقدار پوچ رو میگیره.
بعد if چک میکنه اگه رشتهای (استرینگ) که بهش داده شده خالی هست، ادامه کار رو انجام بده. اگه ماشینمجازی درحال اجرا نباشه، متغیر VAR خالی به حساب میاد، شرط if درست میشه و کامپیوتر خودش رو خاموش میکنه.
این شرط فقط یهبار اجرا میشه و اگه اون موقع ماشینمجازی شما درحال اجرا باشه، اتفاقی نمیفته و بعد هم کامپیوتر خاموش نمیشه. برای حل این مشکل باید کاری کنید که مرتب این شرط چک بشه. اینکار رو میتونید با گذاشتن دستوراتی نوشتم، داخل یه حلقه تکرار بینهایت انجام بدید. چیزی که نوشتم رو ببینید:
while :
do
VAR="$(pgrep qemu-system-x86)"
if [ -z "$VAR" ]; then
poweroff
fi
done
ولی یه مشکلی که داره این هست که اگه چندین ماشین مجازی با معماری x86 همزمان توسط qemu/kvm اجرا شدن، کامپیوتر خاموش نمیشه.
مشکل دیگهای که هست اینه که ممکنه کارهای دیگه هم درحال اجرا باشه که وقتی یهو کامپیوتر خاموش میشه، ممکنه باعث مشکل بشه. ولی از اونجایی که کامپیوتر شما داره توی خونه استفاده میشه، این مشکل بعیده که اتفاق بیوفته.
برای اطمینان، میتونید poweroff رو به shutdown تغییر بدید تا 1 دقیقه بعد از اینکه ماشینمجازی خاموش شد، کامپیوتر شما هم خاموش بشه.
بهتره قبل از while دستور sleep 5 رو هم بنویسید تا قبل از اینکه برنامه وارد حلقه بشه، ۵ ثانیه صبر کنه تا از اجرا شدن ماشینمجازی مطمئن بشید.