Menjaga Mac OSX dan tidak bisa tidur saat tugas / aplikasi sedang berjalan

10

Saya ingin membiarkan rsync bekerja di wifi selama berjam-jam menyalakan daya AC. Tetapi ketika saya melakukannya, Mac memutuskan koneksi setelah beberapa waktu.

Pada panel Pengaturan Energi, ini dikonfigurasikan ke "Computer Never Sleep", "Masukkan hard disk ke mode tidur jika memungkinkan" dan "Bangun untuk akses jaringan".

Plus itu akan lebih baik jika mac benar-benar pergi tidur setelah tugas selesai.

Saya menyadari pertanyaan yang sangat mirip telah diajukan sebelumnya dan bahwa ada pmset dan insomniaX , tetapi saya tidak ingin mesin menjadi sulit tidur . Dan saya tidak ingin terus menginstal ekstensi lebih dan lebih banyak, juga tidak harus mengubah pmset setiap waktu.

Saya ingin itu berperilaku asli seperti yang diharapkan - tetap terjaga sementara saya membiarkannya menjalankan tugas, dan kemudian tidur "jika mungkin". Kali ini karena rsync, tetapi waktu berikutnya bisa menjadi sesuatu yang lain.

Apakah saya berharap terlalu banyak seperti biasanya? Bisakah saya memperbaikinya? Apakah itu rusak?

cregox
sumber

Jawaban:

10

Kafeinasi

Sebagai contoh:

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

Dari halaman manual:

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.

Ini juga dapat digunakan untuk situasi seperti "jangan biarkan layar tidur saat saya menonton film ini":

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

... atau "tetap terjaga selama 10.000 detik berikutnya":

caffeinate -t 10000

Lihat man caffeinatedetailnya.

Nathan Long
sumber
2
Ini benar-benar luar biasa! Apakah ini bawaan pada OSX? Sejak versi mana? (Saya tidak dapat dengan cepat menemukan info tentang ini)
cregox
@ Cawas - sesuai dengan artikel ini, ia mulai dikirim dengan Mountain Lion: cnet.com/news/... Saya mengetahuinya dari man pmsetmana, di mana noidleopsi ini terdaftar sudah usang.
Nathan Long
Juga, lihat tutorial yang bagus ini: computer.tutsplus.com/tutorials/…
Nathan Long
4

Jiggler hanya dapat diatur untuk "jiggle" mouse saat sedang berjalan. Ini akan mencegah layar dan komputer dari tidur. Ini tidak akan berfungsi pada laptop dengan tutupnya tertutup. Untuk itu Anda memerlukan InsomniaX atau aplikasi berbasis kext lainnya.

masukkan deskripsi gambar di sini

Josh K.
sumber
Tanpa tutup, tidak apa-apa. Saya tidak ingin terlalu panas.
cregox
Aplikasi kecil yang praktis, memang.
ayaz
Yah, sementara saya tidak membutuhkannya lagi, ini benar-benar menyelesaikan masalah saya, dan sepertinya solusi yang bagus. Saya kira saya seharusnya menerimanya dengan cara sebelumnya.
cregox
2

Alternatif lain adalah Kafein . Ini adalah aplikasi - bukan ekstensi - yang membuat mesin "aktif" untuk jangka waktu tertentu, setelah itu mesin dapat melakukan apa pun yang biasanya akan dilakukan: kosong, jalankan screensaver, tidur, dll. Artinya, itu tidak akan t membuat mesin Anda tidur, tetapi akan membiarkannya. Tampaknya secara fungsional setara dengan pengaturan pengaturan penghemat energi menjadi "tidak pernah" untuk periode yang Anda minta, dan mengembalikannya sesudahnya.

masukkan deskripsi gambar di sini

JRobert
sumber
Tetapi Anda masih harus memulai dan menghentikan aplikasi. Anda tidak dapat mengaturnya dan lupa.
Josh K
1

Anda mungkin mempertimbangkan untuk membuat Aplikasi Applescript Tetap-Buka yang mengatur / mengatur ulang pengatur waktu tidur berdasarkan keberadaan proses yang sedang berjalan. Membuat launchd plist juga merupakan solusi yang layak, namun saya masih ragu-ragu pada sintaksisnya. Perintah "pmset force sleep X" tidak memerlukan akses root, tetapi pengaturannya diatur ulang saat reboot.

Karena situasimu terdengar seperti aku tidak akan dapat mengantisipasi setiap kebutuhanmu, aku akan membuat sketsa untukmu.

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

Untuk hal-hal seperti rsync dan proses latar belakang, Anda harus mendapatkan yang lebih pintar dan polling fungsi-fungsi lain seperti $ 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

Perhatikan bahwa dalam kasus di atas, mencari hanya "rsync" akan menghasilkan false positive jika rsyncd berjalan karena "rsync" dan "rsyncd" cocok. Anda mungkin harus lebih rumit jika ini tidak berhasil untuk Anda.

Jika aplikasi adalah proses Windowed, saya akan menggunakan yang berikut ini untuk menentukan apa yang berjalan:

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

Atau untuk pengidentifikasi bundel (lebih tepat)

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

Ceritakan lebih banyak tentang skenario Anda dan saya akan mencoba menulis sesuatu yang lebih tepat dan dengan antarmuka pengguna yang lebih fleksibel.

dotHTM
sumber
Dam, aku akan melihat semua yang kamu katakan di sini lain kali, tapi terima kasih telah melewati semua masalah ini! Saya tidak benar-benar mempertimbangkan untuk menulis skrip untuk saat ini. :)
cregox
Terima kasih telah membawa jawaban saya kembali ke nilai non-negatif. Saya hidup dengan scripting. Saya buruk dengan BASH, tapi saya sangat suka AppleScript dan menjalankan perintah Terminal darinya.
dotHTM