Giữ Mac OSX hoạt động và mất ngủ khi tác vụ / ứng dụng đang chạy


10

Tôi muốn để rsync hoạt động qua wifi trong nhiều giờ đã bật nguồn AC. Nhưng khi tôi làm như vậy thì Mac bị ngắt kết nối sau một thời gian.

Trên khung Cài đặt năng lượng, nó được cấu hình thành "Máy tính không bao giờ ngủ", "Đặt đĩa cứng vào chế độ ngủ khi có thể" và "Đánh thức để truy cập mạng".

Thêm vào đó, thật tốt nếu mac thực sự đi ngủ sau khi hoàn thành nhiệm vụ.

Tôi nhận ra một câu hỏi tương tự đã được hỏi trước đó và đó là chứng buồn ngủmất ngủX , nhưng tôi không muốn máy bị mất ngủ . Và tôi không muốn tiếp tục cài đặt nhiều tiện ích mở rộng hơn, cũng không phải điều chỉnh thông qua pmset mỗi lần.

Tôi muốn nó hoạt động bình thường như mong đợi - tỉnh táo trong khi tôi để nó chạy một nhiệm vụ, và sau đó đi ngủ "khi có thể". Lần này là do rsync, nhưng lần sau có thể là một cái gì đó khác.

Tôi có mong đợi quá nhiều như bình thường không? Tôi có thể sửa nó không? Nó thậm chí bị hỏng?

Câu trả lời:


10

Caffein

Ví dụ:

caffeinate -i rsync -avz someuser@somehost:somefolder /some/local/folder

Từ trang người đàn ông:

EXAMPLE
     caffeinate -i make
        caffeinate forks a process, execs "make" in it, and holds an
        assertion that prevents idle sleep as long as that process
        is running.

Nó cũng có thể được sử dụng cho các tình huống như "không để màn hình ngủ khi tôi đang xem phim này":

caffeinate -d # in effect until you hit Ctrl+C

... Hoặc "tỉnh táo trong 10.000 giây tiếp theo":

caffeinate -t 10000

Xem man caffeinateđể biết chi tiết.


2
Điều này là cực kỳ tuyệt vời! Đây có phải là mặc định trên bất kỳ OSX? Kể từ phiên bản nào? (Tôi không thể nhanh chóng tìm thấy thông tin về điều này)
cregox

@Cawas - theo bài viết này, nó đã bắt đầu giao hàng với Mountain Lion: cnet.com/news/ nam Tôi đã tìm hiểu về nó từ đó man pmset, trong đó noidletùy chọn được liệt kê là không dùng nữa.
Nathan Long

Ngoài ra, hãy xem hướng dẫn thú vị này: computer.tutsplus.com/tutorials/
Kẻ

4

Jiggler có thể được đặt thành chỉ "lắc lư" con chuột khi nó chạy. Điều này sẽ ngăn màn hình và máy tính ngủ. Điều này sẽ không hoạt động trên một máy tính xách tay với nắp đóng. Cho rằng bạn cần InsomniaX hoặc một ứng dụng dựa trên kext khác.

nhập mô tả hình ảnh ở đây


Không có nắp đóng, đó là tốt. Tôi không muốn quá nóng.
cregox

Ứng dụng nhỏ tiện dụng, thực sự.
ayaz

Chà, trong khi tôi không cần nó nữa, điều này thực sự đã giải quyết vấn đề của tôi, và nó có vẻ như là một giải pháp tốt. Tôi đoán tôi nên đã chấp nhận nó trước đây.
cregox

2

Một lựa chọn khác là Caffeine . Đó là một ứng dụng - không phải là tiện ích mở rộng - giúp máy luôn hoạt động trong một khoảng thời gian xác định, sau đó máy có thể làm bất cứ điều gì nó thường làm: để trống, chạy trình bảo vệ màn hình, ngủ, v.v. Để máy của bạn ngủ, nhưng sẽ để nó. Có vẻ như chức năng tương đương với việc cài đặt các cài đặt tiết kiệm năng lượng thành "không bao giờ" trong khoảng thời gian bạn yêu cầu và khôi phục chúng sau đó.

nhập mô tả hình ảnh ở đây


Nhưng bạn vẫn phải bắt đầu và dừng ứng dụng. Bạn không thể đặt nó và quên.
Josh K

1

Bạn có thể xem xét việc tạo Ứng dụng Applescript ở trạng thái mở để đặt / đặt lại bộ hẹn giờ ngủ dựa trên sự tồn tại của một quy trình đang chạy. Tạo một bảng khởi chạy cũng là một giải pháp khả thi, tuy nhiên tôi vẫn còn run về cú pháp. Lệnh "pmset force ngủ X" không yêu cầu quyền truy cập root, nhưng cài đặt được đặt lại khi khởi động lại.

Vì tình huống của bạn có vẻ như tôi sẽ không thể lường trước mọi nhu cầu của bạn, tôi sẽ phác thảo điều gì đó cho bạn.

property LoopTime: 5 --measured in seconds
property normalSleepTimeout: 30 --measured in minutes
property processName: "rsync"  --the name of the process you're trying to find

on run
   do shell script "pmset force sleep 0"  --disables sleep
   idle()
end

on idle
   if not appIsRunning() then 
      do shell script ("pmset force sleep " & normalSleepTimeout as string) -- sets sleep to desired idle timeout
      quit
   end
   return 
end

on appIsRunning()
   --Here's where you need to do the test that an app is running.  True needs to mean "the app is running".  Store the value to "result" or change the below return statement.

   return result
end

Đối với những thứ như rsync và các quy trình nền, bạn sẽ cần thông minh hơn và thăm dò các chức năng khác như $ top.

set result to False
if 0 < (count of (do shell script ("top -l 1 | grep" & processName as string))) then
   set result to True
end

Lưu ý rằng trong trường hợp trên, việc tìm kiếm chỉ "rsync" sẽ trả về kết quả dương tính giả nếu rsyncd đang chạy vì cả "rsync" và "rsyncd" đều khớp. Bạn có thể phải nhận được nhiều khó khăn hơn nếu điều này không làm việc cho bạn.

Nếu ứng dụng là một quy trình Windowed, tôi sẽ sử dụng cách sau để xác định những gì đang chạy:

tell application "System Events" to set RunningAppNames to name of processes

Hoặc cho các định danh bó (chính xác hơn)

tell application "System Events" to set RunningBundles to bundle identifier of processes

Nói cho tôi biết thêm về kịch bản của bạn và tôi sẽ cố gắng viết một cái gì đó chính xác hơn và với giao diện người dùng linh hoạt hơn.


chết tiệt, tôi sẽ xem xét tất cả những gì bạn nói ở đây vào lúc khác, nhưng cảm ơn vì đã trải qua tất cả những rắc rối này! Bây giờ tôi không thực sự xem xét việc viết kịch bản. :)
cregox

Cảm ơn vì đã đưa câu trả lời của tôi trở lại giá trị không âm. Tôi sống bằng kịch bản. Tôi khủng khiếp với BASH, nhưng tôi hoàn toàn thích AppleScript và chạy các lệnh Terminal từ nó.
dotHTM
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.