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"?


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

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:


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


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
    ...

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.