Có lệnh bash để kiểm tra xem Time Machine đã sao lưu xong chưa?


16

Tôi đang viết một tập lệnh sẽ rsycnc thư mục Time Machine của tôi đến một máy chủ từ xa bằng ssh. Tôi đã chuyển từ tập lệnh shell sang AppleScript và sau đó quay lại tập lệnh Apple và tôi không thực sự quan tâm loại giải pháp nào sẽ yêu cầu.

Tôi đã thành công khi bắt đầu quá trình sao lưu với đoạn mã nhỏ này.

do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper >/dev/null 2>&1 &"

Những gì tôi đang cố gắng làm bây giờ là có lệnh rsync được thực hiện sau khi sao lưu xong. Có cách nào trong AppleScript để kiểm tra xem quá trình sao lưu đã hoàn thành chưa? Hoặc có một "cái móc" tốt mà bạn có thể sử dụng trong bash để kiểm tra xem nó đã hoàn thành chưa?


Tôi sẽ hỏi tại sao không chỉ rsync bản gốc - Tôi hỏi điều này theo như tôi hiểu rsync không hiểu các thư mục liên kết cứng để cuối cùng bạn sẽ lấy nhiều bản sao của mỗi tệp.
dùng151019

Ý bạn là với mỗi lần sao lưu liên tiếp được thực hiện, Time Machine sẽ tạo một bản sao lưu có liên kết cứng đến các tệp gốc đã được sao lưu? Tôi hỏi điều này bởi vì tôi không quen thuộc với cỗ máy thời gian. Nếu đó là trường hợp, thì có, tôi sẽ sao chép bản gốc. Nhưng tôi khá chắc chắn rằng rsync có một tùy chọn sẽ khiến nó bỏ qua việc tạo lại các liên kết cứng.
whitneyz

1
Vâng, đó là cách TM hoạt động - rsync có thể hiểu các liên kết tệp cứng nhưng tôi không nghĩ rằng tôi hiểu các liên kết thư mục cứng duy nhất cho OSX kể từ 10,5
user151019

Câu trả lời:


4

Đây là một cách - tôi biết nó không ở đâu gần một giải pháp "phù hợp", nhưng tôi tưởng tượng nó sẽ hoạt động.

ps ax | grep "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper" | grep -v 'grep'

Những gì nó làm là tìm kiếm danh sách quy trình cho quá trình helper backupd, sau đó lọc ra lệnh grep tự hiển thị. Nếu lệnh trả về> 0 kết quả, quá trình trợ giúp sao lưu vẫn hoạt động. Nếu không, quá trình đã kết thúc và vì vậy bạn có thể cho rằng nó đã hoàn thành.


1
...pgrep backupd-helper
Jason Salaz

1
Tôi tìm thấy một cách thanh lịch hơn! TIME_MACHINE_PID = $! chờ $ TIME_MACHINE_PID
whitneyz

1
@whitneyz xin vui lòng bạn có thể giải thích TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDcó thể trong một câu trả lời riêng biệt? Cảm ơn bạn.
Graham Perrin

18

tmutil status bây giờ là cách Lion mà chúng ta có một công cụ hay cho loại truy vấn này.

Trên hệ điều hành mới hơn, có một lệnh không có giấy tờ tmutil currentphasehiển thị tên của pha hiện tại.


Có - tmutuilrất nhiều chiến thắng, thật khó để diễn tả mức độ tuyệt vời khi nhìn và chọc vào trạng thái sao lưu, số liệu thống kê và điều khiển mọi thứ theo chương trình.
bmike

Thật điên rồ khi nó dường như không có giấy tờ!
zigg

5

Bạn cũng có thể bắt đầu sao lưu với tmutil startbackup -b. -bchặn lệnh cho đến khi sao lưu xong.


3

tmutil status|grep -c "Running = 1"

trả về '1' khi chạy, '0' khi không.


3

Thiếu các quy trình liên quan đến sao lưu không đảm bảo rằng bản sao lưu Time Machine đã hoàn tất

Trên ổ đĩa mà Time Machine ghi các bản sao lưu của nó: cùng với /Latest/thư mục của Tầm, hãy xem xét:

  • các .inProgress/gói góc độ .

Nếu gói đó tồn tại, một bản sao lưu không đầy đủ.


Lưu ý rằng ngay cả khi không có .inProgressthư mục, Time Machine vẫn có thể bận rộn chuẩn bị hoặc dọn dẹp sau khi sao lưu (ví dụ: xóa các bản sao lưu cũ).
chơi

1

Công việc sau đây đối với tôi ...


Script backup_status:

    #!/usr/bin/env bash
    #
    # Determines if Time Machine is running and works with older Mac OS x versions
    #
    if [ x == x`type -P tmutil` ]; then
            # Older OSx
            count=`ps -ef | grep -v grep | grep -c 'CoreServices/backupd'`
            # Should also detect /Volume/Time Machine …/Latest/… directory ….inProgress/… bundle existence here to make it tight.
    else
            # OSx 10.7+
            count=`tmutil status | grep -c "Running = 1"`
    fi

    if [ $count == 0 ]; then
            echo stopped
    else
            echo running
    fi

Script backup_wait:

    #!/usr/bin/env bash

    #
    # Waits for Time Machine backup to complete
    #
    while [ `backup_status` == running ] ; do
            sleep 2
    done


0

tmutilschỉ tồn tại từ 10.7 trở đi. Trước đó, bạn có thể sử dụng, như đã đề cập, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperđể chạy thủ công Time Machine.

Sau đó bạn có thể sử dụng waitđể đợi cho đến khi quá trình kết thúc. Không có tranh luận, nó sẽ chỉ chờ đợi; nếu bạn cung cấp PID, bạn có thể nhận giá trị trả về của nó (trạng thái thoát).

Đặc biệt, wait $!sẽ chờ quá trình cuối cùng bắt đầu trong lớp vỏ đó. Tuy nhiên, như Lauri đã đề cập, sự chờ đợi này sẽ quay trở lại trước khi cỗ máy thời gian kết thúc bởi vì trình trợ giúp sao lưu kết thúc trước khi sao lưu xong. Tôi không thể tìm thấy bất kỳ tên quy trình nào chỉ ra rằng bản sao lưu chưa hoàn tất.

Nhìn vào nội dung của /var/logs/system.log (hoặc thông qua Bảng điều khiển), tôi nhận thấy rằng khi sao lưu xong, điều cuối cùng được thực hiện là đẩy hình ảnh đĩa máy thời gian. Chắc chắn tôi đã kiểm tra rằng (đây là OS X 10.6.8) trong quá trình sao lưu có a /Volumes/Time Machine Backups. Vì vậy, bạn có thể chỉ cần kiểm tra nếu thư mục tồn tại. Khi nó không còn nữa, Time Machine kết thúc.

Tôi không chắc liệu điều này có hiệu quả với tất cả mọi người hay không vì tôi đã làm theo hướng dẫn ở đây để sao lưu vào máy Windows trên mạng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.