Saya seorang pemula Linux yang relatif. Saya mencoba mempelajari cara menggunakan at
sehingga saya dapat menjadwalkan tugas untuk memulai di lain waktu, tanpa menggunakan sleep
. Saya telah mencari pertanyaan sebelumnya untuk mendapatkan bantuan.
Pertanyaan saya adalah, dalam skrip bash sampel berikut yang telah saya buat, mengapa "Running" tidak pernah - sejauh yang saya tahu - dicetak ke output standar (yaitu, konsol bash saya)?
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
Satu-satunya keluaran yang saya lihat adalah, misalnya:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
Apakah jawaban untuk pertanyaan saya ditemukan dalam peringatan? Jika demikian, bagaimana /bin/sh
perbedaan dari output standar?
sleep 3m; echo Running
Jawaban:
Karena
at
tidak menjalankan perintah dalam konteks sesi pengguna yang Anda masuk. Idenya adalah bahwa Anda dapat menjadwalkan perintah untuk dijalankan pada waktu yang sewenang-wenang, lalu keluar dan sistem akan menjalankan perintah tersebut pada waktu yang ditentukan.Perhatikan bahwa halaman manual untuk
at(1)
secara khusus mengatakan (penekanan saya):Jadi, Anda harus memeriksa gulungan surat lokal Anda atau, gagal itu, log surat sistem lokal. / var / spool / mail / $ USER mungkin merupakan tempat yang baik untuk memulai.
Juga perhatikan bahwa "Memulai" dan "Selesai" berasal dari skrip luar dan dalam dirinya sendiri tidak ada hubungannya
at
sama sekali. Anda bisa mengambilnya atauat
doa dan pada dasarnya Anda akan mendapatkan hasil yang sama.sumber
Seperti yang dijelaskan oleh @ MichaelKjörling, setiap output yang dihasilkan oleh
at
pekerjaan Anda akan ditangkap dan dikirim kepada Anda melalui email. Jika Anda tidak memiliki MTA - Mail Transfer Agent yang sedang berjalan di kotak Anda, maka surel tersebut mungkin berada di limbo dan Anda tidak akan tahu ituat
bahkan sedang mencoba melakukan ini.MTA, adalah program seperti
sendmail
ataupostfix
yang dapat "mengirim" email ke tujuan yang sesuai. Dalam hal ini akan mengirimkannya ke antrian email (file di bawah direktori/var/spool/mail
) di sistem lokal Anda. Setiap pengguna pada sistem dapat memiliki antrian di direktori ini.Pada sistem Fedora saya jika saya mulai
sendmail
maka pengiriman surat lokal dapat terjadi. Saya biasanya memilikinya meskipun.Sekarang kita dapat melihat bahwa antrian email saya untuk akun pengguna saya
saml
kosong:Jadi sekarang kita menjalankan
at
pekerjaan:Kita dapat melihat bahwa pekerjaan sedang menunggu untuk dijalankan dengan
atq
:Menjalankannya lagi setelah beberapa menit kita dapat melihat bahwa
at
pekerjaan selesai:Kebetulan, dengan MTA saya berjalan, saya sekarang mendapatkan pesan ini di terminal saya:
Jadi mari kita periksa:
Yup, kami punya surat, jadi mari kita periksa menggunakan
mutt
:Kami memilikinya di "kotak masuk" antrian email kami:
Mari kita periksa email ini:
Dan itu berhasil.
sumber
Saya menjalankan Debian 8.1 (jessie)
Anda dapat meminta keluaran 'at' ke terminal dengan menggunakan tty.
Satu menit kemudian, dan 'ZZZZZ' akan muncul di terminal Anda ...
sumber
Jawaban di atas adalah cara standar / "benar" untuk melakukannya.
Pendekatan lain yang lebih sederhana dari sudut pandang yang lebih "pengguna akhir" adalah memiliki tugas yang dijadwalkan atau latar belakang menulis hasilnya ke file "log". File dapat berada di mana saja di sistem Anda, tetapi jika tugas berjalan sebagai root (dari
cron
, dll.), Maka di suatu tempat di bawah/var/log
adalah tempat yang baik untuk meletakkannya.Saya membuat
/var/log/maint
direktori dan membuatnya dapat dibaca oleh semua orang dan saya memiliki file yang dapat dibaca di bawah yang disebut "cadangan" di mana saya mencatat output dari skrip cadangan saya.Saya membuat direktori sendiri sehingga file saya tidak tercampur dengan hal-hal yang dihasilkan oleh sistem.
Untuk meletakkan barang di sana (dalam bash):
The
>>
menyebabkan pesan yang akan ditambahkan ke file bukan Timpa setiap kali.Jika skrip saya memiliki banyak output, saya menggunakan skrip atau fungsi untuk output sehingga semuanya dilakukan dengan cara yang sama. Di bawah ini adalah versi saya saat ini (versi berlebihan): (hal-hal VERBOSE ada ketika saya menjalankan skrip dari terminal dan ingin melihat apa yang terjadi untuk keperluan debugging.)
Sunting:
at
Contoh sederhana yang menulis ke file penggunaBelum pernah menggunakan ini selamanya, jadi saya mengetahuinya dengan beberapa skrip sederhana.
Script pertama hanya menjadwalkan acara menggunakan
at
. Perintah itu sendiri bisa saja diketik ke terminal, tapi saya malas - terutama ketika saya harus melakukannya berkali-kali saat mengujinya tanpa membodohi sejarah perintah.Script kedua adalah skrip yang dijadwalkan untuk dijalankan
Saya membuat kedua skrip dalam editor teks, menyimpannya, dan kemudian membuat mereka masing-masing dieksekusi menggunakan
chmod 700 script-file-name
. Saya menempatkan keduanya di$HOME/bin
direktori saya untuk kenyamanan, tetapi mereka bisa di mana saja pengguna saya memiliki akses penuh. Saya menggunakan700
untuk skrip apa pun yang hanya untuk pengujian, tetapi pada sistem pengguna tunggal, bisa juga begitu755
.Saya sudah memiliki direktori yang dipanggil
/home/bigbird/log
untuk menyimpan output darimytest_at_script
. Ini juga bisa di mana saja pengguna Anda memiliki akses penuh. Pastikan sudah ada sebelum skrip berjalan atau minta skrip membuatnya.Untuk menjalankannya, saya hanya memastikan waktu untuk
at
perintahmytest_at_run
itu sedikit di masa depan dan kemudian menjalankannya dari terminal. Saya kemudian menunggu sampai berlari dan memeriksa isinya$HOME/log/at.log
.Beberapa catatan:
Meskipun saya menjalankan
at
dari pengguna saya, itu tidak tahu lingkungan saya sepertiPATH
direktori rumah saya dan saya, jadi saya tidak menganggap itu. Saya menggunakan jalur penuh seperti yang saya lakukan untukcron
pekerjaan apa pun . Dan jika saya ingin membuatnya menjadicron
pekerjaan, saya tidak perlu mengubah apa pun hanya untuk membuatnya berjalan.Aku digunakan
>>
dalammytest_at_script
output append ke file log bukannya>
yang akan diganti pada setiap run. Gunakan mana yang paling sesuai dengan aplikasi Anda.sumber
at
untuk menulis ke file. Sepertinya Anda mendapatkan urutan panggilan mundur dalam contoh Anda. Saya tidak pandai mengatakanat
kapan harus menjalankan pekerjaan, jadi saya hanya membuat kode waktu dalam waktu dekat.