diskutil eject: Mac Terminal से ड्राइव कैसे Eject करें

diskutil से किसी भी Mac ड्राइव को Terminal से eject करें, जिसमें eject न होने वाले volume को force-unmount करना और lsof से यह ढूँढना शामिल है कि उसे कौन रोके हुए है।

(Updated )

Finder बताता है कि ड्राइव इस्तेमाल में है। यह नहीं बताता कि उसे इस्तेमाल कौन कर रहा है या इसके बारे में क्या किया जाए। Terminal दोनों बता देता है।

झटपट जवाब: ड्राइव को Terminal से eject करने के लिए diskutil eject /Volumes/YourDriveName चलाएँ। अगर यह नाकाम हो, तो यह देखने के लिए कि ejection को कौन रोक रहा है sudo lsof /Volumes/YourDriveName इस्तेमाल करें, बाधक प्रोसेस को रोकने के लिए kill <PID>, फिर दोबारा eject करें। आख़िरी उपाय के तौर पर, diskutil unmountDisk force /dev/diskN ड्राइव को ज़बरन हटा देता है, लेकिन ऐसा सिर्फ़ तब करें जब कोई चीज़ सक्रिय रूप से न लिख रही हो।

अगर आप command line के साथ सहज हैं, तो macOS पर ज़िद्दी ड्राइव ejections को संभालने का सबसे ताक़तवर तरीक़ा Terminal है। और अगर आप अभी इसके साथ सहज नहीं हैं, तो ये commands शुरुआत करने के लिए अच्छी जगह हैं।

diskutil eject से बुनियादी ejection

Mac Terminal से external ड्राइव eject करने का सबसे सीधा तरीक़ा:

diskutil eject /Volumes/YourDriveName

YourDriveName की जगह अपने ड्राइव का असली नाम डालें, ठीक वैसे ही जैसे वह Finder में दिखता है। अगर नाम में spaces हैं, तो उसे quotes में लपेटें:

diskutil eject "/Volumes/My Drive"

यह वही करता है जो Finder में eject बटन पर क्लिक करना। अगर काम बन जाए, तो ड्राइव साफ़-सुथरे ढंग से unmount हो जाता है और बात ख़त्म। अगर नाकाम हो, तो आपको Finder के मुक़ाबले कहीं ज़्यादा जानकारी देने वाला error message मिलता है।

आप eject किए बिना भी unmount कर सकते हैं (ड्राइव Disk Utility में दिखता रहता है पर mounted नहीं रहता):

diskutil unmount /Volumes/YourDriveName

यह फ़र्क़ multi-partition ड्राइव के लिए मायने रखता है। unmount एक volume हटाता है। eject physical device और उसके सभी volumes को एक साथ हटा देता है।

diskutil list से अपने ड्राइव का identifier ढूँढना

ज़्यादा एडवांस्ड commands इस्तेमाल करने से पहले, आपको अपने ड्राइव का identifier चाहिए। सभी जुड़े हुए disks की सूची बनाएँ:

diskutil list

output हर disk और उसके partitions को दिखाता है। आपका external ड्राइव कुछ इस तरह होगा जैसे disk4 या disk5। internal ड्राइव आम तौर पर disk0 और disk1 होते हैं।

सिर्फ़ external ड्राइव का ज़्यादा पढ़ने लायक़ ब्यौरा पाने के लिए:

diskutil list external

एक बार जब आपको disk identifier पता चल जाए, तो आप volume नाम के बजाय /dev/ path इस्तेमाल करके भी eject कर सकते हैं:

diskutil eject /dev/disk4

यह तब काम का है जब volume के नाम में असामान्य characters हों या जब volume mounted न हो पर disk अब भी जुड़ा हो।

सभी external ड्राइव को एक साथ कैसे eject करें

अगर आपको एक ही command में हर external ड्राइव eject करना हो, तो दो तरीक़े हैं।

diskutil से सभी external disks को ढूँढना और eject करना:

diskutil list external | grep -o 'disk[0-9]*$' | while read disk; do diskutil eject "/dev/$disk"; done

या Terminal से AppleScript इस्तेमाल करना, जो वही करता है जो Finder करता है:

osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'

AppleScript वाला तरीक़ा सिर्फ़ उन्हीं disks को eject करता है जिन्हें Finder ejectable मानता है। यह आपके startup disk और network volumes को छोड़ देता है, जो आम तौर पर आप यही चाहते हैं।

diskutil eject नाकाम होने पर force unmount करना

अगर सामान्य eject किसी error के साथ नाकाम हो जैसे “couldn’t unmount disk,” तो उसे ज़बरदस्ती करें:

diskutil unmount force /Volumes/YourDriveName

या किसी ख़ास disk के सभी volumes को एक साथ unmount करें:

diskutil unmountDisk force /dev/disk4

force unmount macOS को कहता है कि volume को इस्तेमाल कौन कर रहा है, इसकी परवाह किए बिना उसे छोड़ दे। यह ड्राइव को physically निकालने से ज़्यादा नियंत्रित है (सिस्टम अब भी caches flush करता है और प्रोसेस को सूचित करता है) लेकिन यह प्रोसेस के files साफ़-सुथरे ढंग से बंद करने का इंतज़ार नहीं करता।

force unmount तब इस्तेमाल करें जब आपको पता हो कि कोई ज़रूरी चीज़ लिखी नहीं जा रही। यह Disk Utility से force-eject करने का command-line समकक्ष है। किसी ऐसे ड्राइव पर इसे इस्तेमाल करने से पहले जो सक्रिय रूप से इस्तेमाल में था, हमारी गाइड force eject कब सुरक्षित है और कब जोखिम भरा देखें।

lsof से यह ढूँढना कि ejection को कौन रोक रहा है

यही वह command है जो ejection की समस्याओं के लिए Terminal को बेशक़ीमती बना देता है:

lsof /Volumes/YourDriveName

lsof का मतलब है “list open files.” यह हर उस प्रोसेस को दिखाता है जिसकी उस volume पर कोई file खुली है, प्रोसेस का नाम, प्रोसेस ID (PID), उसे चलाने वाला user, और कौन सी file खुली है। (lsof के flags और pattern पर एक केंद्रित चर्चा के लिए, हमारी Mac यूज़र्स के लिए lsof command गाइड देखें।)

पूरे नतीजों के लिए (सिस्टम प्रोसेस समेत), इसे sudo के साथ चलाएँ:

sudo lsof /Volumes/YourDriveName

sudo के बिना, आपको सिर्फ़ अपने user account के मालिकाना वाले प्रोसेस दिखते हैं। Spotlight के mds या Time Machine के backupd जैसे सिस्टम प्रोसेस नहीं दिखेंगे। sudo के साथ, आपको वह सब कुछ दिखता है जो असल में ड्राइव को खुला रोके हुए है।

lsof की output पढ़ना

output कुछ इस तरह दिखती है:

COMMAND   PID   USER   FD   TYPE   DEVICE   SIZE/OFF   NODE   NAME
mds       123   root   12r  REG    1,8      4096       789    /Volumes/MyDrive/.Spotlight-V100/...
Finder    456   aaron  15r  DIR    1,8      1024       2      /Volumes/MyDrive
Dropbox   789   aaron  8u   REG    1,8      8192       345    /Volumes/MyDrive/Projects/.dropbox

सबसे ज़्यादा मायने रखने वाले columns:

  • COMMAND: प्रोसेस का नाम, यह आपको बताता है कि ejection को कौन रोक रहा है।
  • PID: प्रोसेस ID, ज़रूरत पड़ने पर आप इसी से प्रोसेस को kill करेंगे।
  • FD: FD बताता है कि फ़ाइल किस मोड में खोली गई थी: r पढ़ने के लिए, w लिखने के लिए और u दोनों के लिए। यह मौजूदा गतिविधि नहीं बताता और वॉल्यूम पर कोई लंबित लिखना न होने का प्रमाण नहीं है।
  • NAME: वह ख़ास file जिसे access किया जा रहा है, यह अक्सर ठीक-ठीक ज़ाहिर कर देती है कि प्रोसेस वहाँ क्यों है।

आम जिम्मेदार: mds (Spotlight indexing), backupd (Time Machine), Dropbox, Google Drive, और ख़ुद Finder। निशाने पर लगने वाले समाधानों के लिए हमारी विस्तृत चर्चाएँ देखें, Spotlight का ejection रोकना और iCloud/Dropbox का ड्राइव ejection रोकना।

blocking प्रोसेस को kill करना

समर्थित ऐप्स को मेन्यू बार से बंद करें। सिस्टम प्रक्रियाओं का अलग प्रबंधन होता है और उनके लिए प्रतीक्षा या Mac को बंद करना ज़रूरी हो सकता है। काम सहेजें, कॉपी और बैकअप पूरा करें और ऐप्स को सामान्य तरीके से बंद करके फिर इजेक्ट करें। फ़ोर्स क्विट या फ़ोर्स इजेक्ट से डेटा खो सकता है; Ejecta लिखने की सुरक्षा प्रमाणित नहीं करता।

kill 789

यह एक graceful termination signal भेजता है। प्रोसेस को files बंद करने और सफ़ाई करने का मौक़ा मिलता है। उसे निकलने के लिए कुछ सेकंड दें, फिर दोबारा eject करके देखें।

अगर वह graceful kill पर जवाब न दे:

kill -9 789

फ़ोर्स क्विट अंतिम उपाय है। इससे बिना सहेजा काम खो सकता है या लिखना बाधित हो सकता है। पहले सहेजें और ट्रांसफ़र पूरा होने दें। Spotlight के प्रक्रिया नाम केवल पढ़ने का प्रमाण नहीं हैं। ड्राइव मुक्त करने के लिए mds या mds_stores को फ़ोर्स क्विट न करें। प्रतीक्षा करें, ऐप्स बंद करें और सामान्य तरीके से इजेक्ट करें। Ejecta इन प्रक्रियाओं को पहचानता है, लेकिन सिस्टम प्रक्रियाओं के लिए सामान्य क्विट नहीं देता। ड्राइव फिर भी अटकी हो तो सब कुछ सहेजें और Mac को पूरी तरह बंद करने के बाद ही ड्राइव निकालें।

काम सहेजें, कॉपी और बैकअप पूरा करें और ऐप्स को सामान्य तरीके से बंद करके फिर इजेक्ट करें।

पूरा समस्या-समाधान वर्कफ़्लो

काम सहेजें, कॉपी और बैकअप पूरा करें और ऐप्स को सामान्य तरीके से बंद करके फिर इजेक्ट करें।

diskutil eject "/Volumes/YourDriveName"
sudo lsof "/Volumes/YourDriveName"

Spotlight के प्रक्रिया नाम केवल पढ़ने का प्रमाण नहीं हैं। ड्राइव मुक्त करने के लिए mds या mds_stores को फ़ोर्स क्विट न करें। प्रतीक्षा करें, ऐप्स बंद करें और सामान्य तरीके से इजेक्ट करें। Ejecta इन प्रक्रियाओं को पहचानता है, लेकिन सिस्टम प्रक्रियाओं के लिए सामान्य क्विट नहीं देता। ड्राइव फिर भी अटकी हो तो सब कुछ सहेजें और Mac को पूरी तरह बंद करने के बाद ही ड्राइव निकालें।

प्रक्रिया का नाम या खुली फ़ाइलों की सूची यह साबित नहीं करती कि लिखना बंद है। काम सहेजें, कॉपी और बैकअप पूरा करें और ऐप्स को सामान्य तरीके से बंद करके फिर इजेक्ट करें। फ़ोर्स क्विट या फ़ोर्स इजेक्ट से डेटा खो सकता है; Ejecta लिखने की सुरक्षा प्रमाणित नहीं करता।

काम के diagnostic रूपांतर

जाँचें कि कहीं ख़ास तौर पर Spotlight ही तो आपका ड्राइव नहीं रोके हुए:

lsof /Volumes/YourDriveName | grep mds

ejection रोकने वाले सिर्फ़ अनोखे प्रोसेस नामों की सूची बनाएँ (कोई दोहराई गई लाइन नहीं):

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

real-time disk I/O देखें ताकि पता चले कि कोई चीज़ सक्रिय रूप से लिख तो नहीं रही:

sudo fs_usage -f diskio | grep YourDriveName

यह लगातार चलता रहता है और हर disk operation को जैसे ही वह होता है, दिखाता जाता है। रोकने के लिए Control-C दबाएँ। इसे तब इस्तेमाल करें जब lsof कोई प्रोसेस दिखाए लेकिन आप पक्के न हों कि वह सक्रिय रूप से लिख रहा है या बस कोई पुराना handle पकड़े हुए है।

जब Terminal अपनी क़ीमत से ज़्यादा मेहनत माँगने लगे

ये commands ताक़तवर हैं, और एक बार जब आप इन्हें कुछ बार इस्तेमाल कर लेते हैं, तो ये अपने-आप होने लगती हैं। लेकिन अपने काम से हटकर Terminal window पर जाने की एक असली क़ीमत होती है, diagnostic commands चलाना, तकनीकी output पढ़ना-समझना, यह तय करना कि कौन सा PID kill करना सुरक्षित है।

Ejecta: Ejecta बिना समय-सीमित ट्रायल के मुफ़्त ड्राइव निदान देता है। भुगतान वाला लाइसेंस समर्थित ऐप्स के क्विट व इजेक्ट, सभी ड्राइव इजेक्ट करने और Time Machine नियंत्रण को खोलता है। सिस्टम प्रक्रियाओं में प्रतीक्षा, अनुमति या Mac बंद करना ज़रूरी हो सकता है। पहले काम सहेजें और ट्रांसफ़र पूरे करें।

कंप्यूटर या सक्रियण की संख्या की कोई सीमा नहीं। 30 दिनों के भीतर रिफ़ंड का अनुरोध करें।

Ejecta बिना समय-सीमित ट्रायल के मुफ़्त ड्राइव निदान देता है। भुगतान वाला लाइसेंस समर्थित ऐप्स के क्विट व इजेक्ट, सभी ड्राइव इजेक्ट करने और Time Machine नियंत्रण को खोलता है। सिस्टम प्रक्रियाओं में प्रतीक्षा, अनुमति या Mac बंद करना ज़रूरी हो सकता है। पहले काम सहेजें और ट्रांसफ़र पूरे करें।

अभी खरीदें - $29 $9.99