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.