Saya sudah:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
berjalan sebagai pengatur waktu yang sederhana dan tanpa embel-embel untuk mengingatkan saya kapan sesuatu harus dilakukan. Itu sleep 210m
adalah PID 25347.
Saya mencoba mencari tahu berapa banyak waktu yang tersisa dalam tidur. Yang terbaik yang saya hasilkan, dengan saya memasukkan jumlah tidur asli (210 menit) adalah:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Penjelasan: Bit pertama menghitung jumlah detik dalam tidur asli; $(ps…)
bit mendapatkan waktu sejak tidur dimulai dalam detik, kemudian sisanya menguranginya dan ditampilkan dalam hitungan menit dan detik.)
Itu terjadi pada saya ini akan berguna secara umum; apakah ada cara yang lebih baik untuk melakukan ini? Atau setidaknya cara cerdas untuk mengurai waktu tidur ps -o args
?
sh -c 'sleep 1; sleep 2'
dengan banyaksh
implementasi, itu adalah proses yang sama yang mengeksekusish
dan kemudian mengeksekusisleep 2
(1 detik kemudian).exec
). Tapi itu poin bagus untuk solusi umum apa pun.mksh
danksh93
setidaknya) memilikisleep
built-in (jadi tidak akan munculps
)., Anda harus tahu terlebih dahulusleep
implementasi yang Anda hadapi.Jawaban:
Mendukung
sleep
argumen GNU atau Solaris 11 (satu<double>[smhd]
durasi atau lebih , demikian juga akan bekerja dengan implementasi tradisional yang hanya mendukung satu angka integer desimal (seperti pada FreeBSD), tetapi tidak dengan mereka yang menerima argumen yang lebih kompleks seperti durasi ISO-8601 ). Menggunakanetime
bukanetimes
sebagai yang lebih portabel (Unix standar).(
s/\?//g
adalah untuk menghilangkan?
karakter yangprocps
'ps
digunakan sebagai pengganti karakter kontrol. Tanpa itu, akan gagal untuk menguraikansleep $'\r1d'
atausleep $'\t1d'
... Sayangnya, di beberapa lokal, termasukC
lokal, ia menggunakan.
alih-alih?
. Tidak banyak yang bisa kita lakukan dalam hal ini karena tidak ada cara untuk mengetahui\t5d
dari.5d
(setengah hari)).Lewati pid sebagai argumen.
Itu juga mengasumsikan
argv[0]
diteruskan kesleep
tidak mengandung kosong dan bahwa jumlah argumen cukup kecil sehingga tidak terpotong olehps
.Contoh:
Untuk
[[[ddd-]HH:]MM:]SS
output, bukan hanya jumlah detik, gantiprint $t
dengan:sumber
0xffp-6d
... Sekarang, itu adalah ujian! Tetapi sebenarnya tidur GNU juga membutuhkan hal-hal sepertisleep 1h 30m
...sleep 1h -1m
yang berfungsi pada Solaris 11 tetapi tidak dengan GNUsleep
. Kembali ke papan gambar. Setidaknya itu tidak mendukung durasi iso8601 seperti ksh93 yang akan jauh lebih sulit.sleep
jeda. Bahkan mungkin menampilkan nilai negatif dalam kasus ini.remaining_sleep_time 12838
kembali-40642
. Mungkin ada di "Jeda" sebagai negara bagian @rush tetapi tidak yakin cara men-debug?Ini sepertinya masalah yang menyenangkan untuk dipecahkan; karena thrig membahas opsi perl, inilah skrip bash yang melakukan hal serupa. Ini tidak melakukan cukup pengecekan kesalahan (ini mengasumsikan bahwa Anda memberikan PID valid dari perintah tidur). Ia menangani sintaks yang sama dengan yang dilakukan GNU's coreutils sleep , yaitu:
sumber
sleep 0.5d
atausleep 1e5
atausleep infinity
). Beralih daribash
shell yang mendukung floating point seperti zsh, ksh93 atau yash akan membantu. Bukan ituetimes
tidak portabel.perl
Ini mungkin lebih baik dilakukan dengan skrip yang dapat menunjukkan waktu yang tersisa ketika disadap dengan
QUIT
(biasanya control+\) atauINFO
sinyal.sumber
zsh
'ssched
danat
perintah untuk pendekatan lain yang memungkinkan query waktu.Seharusnya cukup mudah dengan modul python tqdm.
Menunjukkan bilah kemajuan visual yang bagus dan dapat digunakan sebagai pipa unix.
https://pypi.python.org/pypi/tqdm
Potongan python berikut ini dihitung 100 detik
55% | ██████████ | 55/100 [00:55 <00:45, 1.00s / it]
sumber