Mudah menjadwalkan perintah untuk dijalankan nanti?

87

Apa cara sederhana untuk menjalankan perintah, katakanlah, 8 jam dari sekarang? Saya bisa memikirkan cara ini:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Apakah ada cara yang lebih "layak"?

Steve Bennett
sumber
Apakah ada yang salah dengan nohup+ sleep? Mengapa "tidak pantas"?
cprn

Jawaban:

123

Anda bisa menggunakan atperintah. The atmenjalankan perintah di lain waktu. The atutilitas akan membaca perintah dari input standar dan kelompok mereka bersama-sama sebagai di-job, akan dieksekusi di lain waktu.

Biasanya, atdiinstal secara default di Ubuntu, tetapi jika rilis Anda tidak menyertakannya, instal melalui:

sudo apt-get install at

Untuk informasi lebih lanjut, opsi, contoh, dan lainnya lihat Ubuntu Manpage Repository

Contoh:

at now +8 hours -f ~/myscript.sh

Anda juga dapat menggunakan steno yang mudah digunakan, seperti tomorrowatau noon, seperti dalam

echo "tweet fore" | at teatime 

Peringatan: Ini akan menjalankan perintah di sebelah kiri pipa segera tetapi hanya menyajikan hasilnya nanti. Contoh ini juga menunjukkan bagaimana Anda dapat menyalurkan aksiat. at -cadalah cara Anda dapat memeriksa tindakan yang dijadwalkan, yang dapat Anda daftarkan dengan mudah dengan jumlahnya, seperti:

at -c 3
Mitch
sumber
19
Mungkin bermanfaat untuk menambahkan contoh penggunaan sederhana yang membahas pertanyaan at now +8 hours -f ~/myscript.sh
pengirim
6
Selain itu, ada at 8:00untuk menjalankan perintah pada waktu yang absolut, dan batchuntuk "ketika sepertinya komputer dalam keadaan diam"
Simon Richter
4
Kalau-kalau ada yang bertanya-tanya, teatimejam 4 sore. Untuk beberapa alasan itu tidak disebutkan dalam manpages.ubuntu.com/manpages/raring/man1/at.1posix.html tetapi ada di man atdan di sini manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan
3
Mungkin kita dapat menyebutkan bahwa utilitas "at" tidak diinstal secara default dan jika orang lain ingin mendapatkannya cukup instal paket "at"? Sunting: Pokoknya, saya cukup mengedit jawabannya (juga memperbaiki tautan halaman manual).
heartsmagic
4
Berhati-hatilah bahwa perpipaan ke at akan menjalankan perintah segera dan hanya menjadwalkan output. Saya mengalami kegagalan cetak 3D 4 jam karena saya ingin menjadwalkan gpio write 8 1tetapi dieksekusi segera.
Maciej Swic
8

Ya, Anda dapat mengatur pekerjaan cron.

Misalnya jika sekarang waktunya 14:39:00 dan hari ini adalah Jumat, 30 Agustus, Anda dapat menambahkan tugas cron berikut (akan dieksekusi setelah 8 jam) dalam file crontab Anda menggunakan crontab -eperintah:

39 22 30 8 5  /path/to/mycommand.sh

Lebih tentang:

Radu Rădeanu
sumber
3
Ok, ya, saya seharusnya menyebutkan saya tahu tentang pekerjaan Cron. Ini bahkan lebih berantakan karena ia duduk di dalam crontab tanpa batas, kan?
Steve Bennett
4
@ RaduRădeanu: dengan cron, berhati-hatilah bahwa ia dapat menembak lagi dalam beberapa tahun (ketika ada lagi 30 Agustus yang terjadi pada hari Jumat) ...
Olivier Dulac
2
Ini adalah peretas cerdas. Namun 'at' adalah cara yang jauh lebih baik. Apa yang akan terjadi jika komputer dimatikan pada 14:39?
emory
1
Kesalahan itu masih bukan maksud saya. Maksud saya adalah bahwa teks yang Anda masukkan akan (saya pikir) benar-benar masih duduk di crontab Anda setelah acara, menciptakan tugas pembersihan lainnya untuk Anda.
Steve Bennett
2
@SteveBennett Ya, Anda benar. Perintah akan tetap di Anda crontabsampai Anda menghapusnya. Setahun kemudian, ketika Anda lupa siapa yang meletakkannya di sana dan mengapa, Anda akan dibiarkan menggaruk-garuk kepala bertanya-tanya apa yang harus dilakukan dengan perintah.
Paddy Landau
8

Gunakan GUI berbasis Gnome untuk cron, at, dan sejenisnya:

Pengenalan CronHowto menyarankan penggunaan gnome-schedulegui, yang jauh lebih bagus daripada mengetik semua sampah ke terminal (khususnya untuk pengguna "rata-rata" Ubuntu yang bukan "kekuatan" * pengguna nix / bsd.)

Jalankan dengan menggunakan Unity Dash (atau menu aplikasi lain) untuk mencari Tugas Terjadwal atau menjalankan gnome-schedule.

Pada sistem Ubuntu berbasis Gnome, Gnome Scheduled task tool (dari paket gnome-schedule) di Applications -> System Tools menyediakan antarmuka grafis dengan permintaan untuk menggunakan Cron. Situs web proyek ada di http://gnome-schedule.sourceforge.net/ ; perangkat lunak dapat diinstal dari Pusat Perangkat Lunak atau dengan mengetik

sudo apt-get install gnome-schedule

di terminal.

Menggunakan gnome-schedule, untuk skrip di direktori home Anda, perintah "at" baru akan diatur menggunakan jenis jendela ini:

masukkan deskripsi gambar di sini

pengguna29020
sumber
5

Saya menemukan cara cepat dan kotor untuk melakukan ini sebelum saya tahu atada sesuatu.

Katakan Anda ingin skrip Anda dijalankan pada siang hari:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Katakan Anda ingin menjalankannya besok siang (hari ini 24 November untuk saya):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Pembaruan : Metode yang sedikit lebih baik: hanya menguji angka yang Anda pedulikan, menggunakan date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
wjandrea
sumber
10
Untuk dua orang yang pernah upvoted jawaban ini, silakan gunakan at, cron, atau aplikasi scheduler nyata lainnya. Penjadwalan tugas itu sulit, dan bukan roda yang harus Anda temukan kembali.
dimo414
1
@ dimo414 Apa yang salah dengan metode saya?
wjandrea
8
Minimal, ini sibuk menunggu, yang sia-sia. Lebih buruk lagi, itu tidak dijamin benar; sangat mungkin (jika tidak mungkin) untuk kondisi terlewatkan. Mendasarkan penjadwal Anda pada ekspresi reguler juga sangat rawan kesalahan. Ini mungkin bekerja dengan cukup baik , tetapi tidak memiliki kelebihan at.
dimo414
(Selain: Saya tidak menjawab jawaban Anda, saya pikir orang tidak perlu menggunakannya)
dimo414
4
Alasan lain untuk digunakan atadalah karena tugasnya akan selamat dari reboot.
manatwork