Jalankan perintah setelah detik (tanpa tidur)

15

Bagaimana saya bisa menjalankan perintah setelah X detik tanpa tidur. Atau dengan tidur tetapi tanpa shell hanya menunggu respon dari perintah itu?

Saya menggunakan ini tetapi tidak berhasil

sleep 5 ; ls > a.txt

Saya harus menjalankannya di latar belakang. Saya mencoba untuk tidak harus menjalankannya dalam skrip saya mencoba untuk menjalankan lssetelah 5 detik, dan shell tidak hanya menunggu akhir dari tidur

Martin
sumber
Mengapa itu tidak bekerja tanpa shell? Kesalahan apa yang Anda dapatkan? Apakah Anda melewati jalur penuh? Apakah Anda tahu bagian mana yang mem-parsing ;?
Hennes
dengan cara ini shell akan memblokir 5 detik dan kemudian menjalankan perintah., shell yang akan macet saya tidak perlu itu.
Martin
Maka Anda harus memulainya dalam skrip di latar belakang, atau di sub-shell.
Hennes

Jawaban:

34

Cara yang lebih ringkas untuk menulis apa yang disarankan Hennes

(sleep 5; echo foo) & 

Atau, jika Anda membutuhkan lebih dari beberapa detik, Anda dapat menggunakannya at. Ada tiga cara memberi perintah kepada at:

  1. Pipa itu:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Simpan perintah yang ingin Anda jalankan dalam file teks, dan kemudian meneruskan file itu ke at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Anda juga dapat meneruskan atperintah dari STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Kemudian, tekan CtrlDuntuk keluar dari atshell. The lsperintah akan dijalankan dalam satu menit.

Anda dapat memberikan waktu yang sangat tepat dalam format [[CC]YY]MMDDhhmm[.ss], seperti pada

$ at -t 201412182134.12 < script.sh

Ini akan menjalankan skrip script.shpada 21:34 dan 12 detik pada 18 Desember 2014. Jadi, secara teori, Anda dapat menggunakan atuntuk menjalankan sesuatu lima detik di masa depan. Namun, itu seperti menggunakan tank untuk memukul lalat, dan saran Hennes lebih baik.

terdon
sumber
Saya terus bermain-main dengan $(sleep 5; echo foo) &saya tidak yakin mengapa saya pikir saya perlu $ di depan itu, tetapi dengan sintaks yang salah saya hanya memposting versi yang lebih panjang (dan lebih dimengerti). (command_for_in_new_shell) lebih pendek.
Hennes
@ Hennes dan saya terang-terangan merobek ide bagus Anda (yang saya angkatbalikkan). Yang saya lakukan adalah memformat ulang menjadi lebih pendek, semua kredit untuk bit berpikir sebenarnya adalah milik Anda :).
terdon
Apakah ada cara untuk digunakan atdengan penundaan dalam hitungan detik?
Dana Gugatan Monica
@NicHartley no. Gunakan waktu tertentu (mis. at 21:43) Jika itu yang Anda inginkan, atau lakukan sesuatu yang sederhana seperti sleep 4 && commandberlari commandsetelah 4 detik.
terdon
4

Anda bisa mengatasinya dengan memulai shell atau skrip di latar belakang.

Contoh:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Active shell prompt di sini

foo 5 detik kemudian output muncul.
Hennes
sumber