Bagaimana cara menjalankan perintah di latar belakang dengan penundaan?

33

Adakah yang bisa menunjukkan kepada saya bagaimana membuat program untuk melakukan tindakan ini: setelah 5 menit

echo "80" > /sys/class/leds/blue/brightness

Saya ingin program ini berjalan di latar belakang (seperti rngdlayanan) Saya tidak bisa melakukan ini karena saya tidak tahu banyak tentang Linux.

pengguna53337
sumber

Jawaban:

51
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

Dengan begitu skrip Anda berlanjut, atau Anda segera memulihkan kontrol, sementara tugas latar belakang skrip baru dimulai, dengan dua perintah: sleep, and echo.

Kesalahan umum adalah mencoba untuk memberikan baik sleepatau echoatau kedua &yang tidak akan bekerja sebagaimana dimaksud. Meluncurkan serangkaian perintah ()meskipun memunculkannya dalam proses shell terpisah, yang kemudian dapat Anda kirim bersama ke latar belakang &.


Untuk kecerdasan itu, di mana saya menemukan itu secara aktif berguna. Di perangkat tertanam saya kembangkan ada aplikasi utama yang bekerja dengan anjing penjaga. Jika gagal dengan cara yang memicu pengawas reset segera setelah startup, berulang kali, sulit untuk memperbaiki jarak jauh karena periode antara OS dimulai dan reset cukup singkat, tidak cukup untuk ssh in, dan memblokir startup aplikasi. Jadi saya perlu cara untuk menentukan sistem restart begitu cepat dan memperkenalkan penundaan jika itu, untuk memberi saya waktu untuk memperbaikinya secara manual.

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

Jika saya masuk dan melakukan touch /tmp/noautostartaplikasi utama tidak akan mulai. Jika anjing penjaga menendang, rm /tmp/startdelaytidak akan dilakukan dan waktu berikutnya sistem dimulai, itu akan memberi saya 30-an tambahan untuk menghentikannya. Kalau tidak, restart akan cepat, tanpa penundaan.

SF.
sumber
Ya saya setuju, tetapi itu juga bisa menjadi bagian dari refleksi pengguna ;-)
Kiwy
Jawaban lain sepertinya melewatkan bagian "di latar belakang". Tidak, saya cukup eksplisit tentang itu: /
goldilocks
@goldilocks: Anda menambahkan pengiriman ke bagian latar belakang hanya setelah saya memposting jawaban saya.
SF.
Tidak, jawaban asli saya adalah menjalankan fungsi yang berisi tidur dengan &latar belakang tidur; "Anda juga perlu latar belakang tidur" berada di baris pertama dari awal. Jika Anda tidak mempercayai saya, lihat pada riwayat edit. Dan jawaban saya 5 menit lebih tua dari jawaban Anda: P
goldilocks
1
@ gekannt: ... eh, pertanyaannya adalah "Bagaimana menjalankan perintah di latar belakang dengan penundaan?" - bagaimana Anda mencapainya? (dan tidak, jika Anda tidak latar belakang ()grup, shell asli akan berhenti sampai yang melahirkan selesai.)
SF.
11

gunakan atperintah

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

yang akan berjalan di latar belakang

exussum
sumber
2
Ini adalah cara yang tepat untuk melakukannya, tetapi memang perlu daemon atd berjalan dan pada kebanyakan sistem perlu memiliki paket yang diinstal.
Julian
Anda dapat menggunakan tanda kutip tunggal untuk menghindari pelarian, dan lepaskan echosemuanya dengan menggunakan heredoc atau herestring.
Chris Down
@Julian, atadalah perintah POSIX standar. Sistem seperti Unix apa yang tidak tersedia secara default?
Stéphane Chazelas
1
@ StéphaneChazelas - pertanyaan bagus. Saya tahu saya memiliki masalah ini tetapi beberapa waktu yang lalu. Saya melakukan sedikit pengecekan dan perintah at tampaknya cukup di mana-mana. Juga tampaknya ATD adalah Linux spesifik dan bahkan pada beberapa sistem Linux dapat digantikan oleh daemon cron gaya BSD. Mari kita anggap komentar saya sudah ketinggalan zaman.
Julian
Saya mencoba 'at' dan tidak ada perintah yang ditemukan di Android 8
beppe9000
6

Jika Anda ingin sesuatu berjalan dalam 5 menit, tetapi sisa program Anda untuk melanjutkan (atau menyelesaikan), Anda juga perlu latar belakang tidur:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

Ini akan mencetak hellodan kemudian 3 detik kemudian (setelah program utama keluar), cetak world.

Bagian yang penting adalah &melakukan fork eksekusi fungsi ke latar belakang.

goldilocks
sumber
1
Bolehkah saya menyarankan runWithDelay () { sleep $1; "${@:2}"; }?
manatwork
1
Saya pikir itu harus dibaca doWhateverWithDelay 3 &dalam contoh kedua Anda.
Baarn
@manatwork: Ceria.
goldilocks
1
@goldilocks, yang penting dalam menggunakan $@adalah Anda dapat mengutipnya dan akan diperluas sebagai daftar kata-kata yang dikutip. Jadi lebih baik membuatnya "$@"(atau "${@}"jika Anda suka kawat gigi). Lihat pastebin.com/MU7hbB2C
manatwork
@manatwork: Poin diambil;) Saya memang mencoba menggunakan args dengan echo ( -n), tapi jelas itu agak naif.
goldilocks