Saya punya masalah aneh dengan $ ACAK di cron. Saya ingin menjalankan perintah beberapa menit secara acak setelah cronjob menyala.
Contoh ini bekerja langsung di terminal dan menunda perintah hingga 30 detik (ganti perintah dengan apa pun yang Anda inginkan, itu sebenarnya sebuah gema ke / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Jika baris yang sama ditempatkan di crontab, perintah selalu langsung aktif tanpa penundaan:
* * * * * sleep `expr $RANDOM \% 30` ; command
Jika saya menggunakan ekspresi tanpa $ RANDOM, itu berfungsi dengan baik - ini membuat penundaan 15 detik:
* * * * * sleep `expr 10 + 5` ; command
Dengan kata lain, sepertinya $ RANDOM tidak berfungsi dalam cron.
Tetapi ini bukan hanya karena $ RANDOM sendiri dievaluasi menjadi nol, karena dengan demikian ini akan memberikan penundaan 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Saya juga telah mencoba dengan && instread of; tapi itu tidak membantu. Bahkan, maka perintahnya tidak menembak sama sekali!
Tentu saja saya dapat menempatkan penundaan dalam sebuah skrip yang kemudian dipanggil dari crontab, tetapi itu tidak menjelaskan masalah saya dan tidak membuat saya belajar :-)
Itu Debian Lenny jika itu membuat perbedaan.
/bin/sh
bukan shell yang sebenarnya, hanya symlink ke shell yang disukai dari sysadmin (biasanya bash atau dash) di Debian./bin/sh
(dan berharap itu kompatibel dengan Bourne shell). Contohnya adalahsystem()
fungsi dalam glibc. Oleh karena itu/bin/sh
biasanya menunjuk ke shell yang kompatibel dengan Bourne tercepat ; dan sysadmin seharusnya mengatur preferensi di baris / etc / passwd yang sesuai, bukan untuk menegakkan preferensi sistem itu secara keseluruhansh
kebash
, tetapi tampaknya tidak relevan.)/bin/sh
poin to dash. Sampai sekarang, saya tidak pernah mendengar tentang tanda hubung. Saya mencarinya dan itu adalah varian ringan dari bash. Juga, saya tidak tahu bahwa cron berlari di lingkungan "lumpuh", tetapi itu menjelaskan berbagai masalah lain yang saya miliki di masa lalu. Btw, saya mulai menggunakan$(())
tetapi karena tidak berhasil saya mencoba segala macam variasi dan berakhir denganexpr
- yang tentu saja tidak berhasil juga. Tapi di situlah saya berakhir :-) Apakah mungkin untuk menjalankan bash shell normal tanpa menggunakan batasanbash -c 'xxxx'
? Btw, apakah tidak mungkin untuk memberikan jeda baris dalam komentar?dash
adalah sebuah shell. Ini tidak lebih atau kurang normal daripadabash
. Itu juga bukan varian. 2) Lihat poin # 1 dan # 2 dalam jawabannya.cron
biasanya berjalan dengan lingkungan yang kurang "penuh", artinya Anda tidak memiliki banyak variabel lingkungan yang sama yang tersedia untuk Anda. Rupanya$RANDOM
salah satunya, dan sebenarnyasleep
perintah Anda gagal dengan kesalahan karena variabel yang tidak ditentukan - itulah sebabnya perintah Anda gagal dijalankan sama sekali ketika Anda beralih ke&&
bukan;
. (Ya, sebenarnya,$RANDOM
adalah fungsi Bash, tetapicron
tidak berjalan di lingkungan Bash penuh, yang jelas tidak memiliki fungsi ini.)Untuk menyelesaikan tugas ini, Anda harus menggunakan skrip Bash terpisah, seperti yang Anda katakan. Sebagai alternatif, Anda mungkin dapat menemukan cara untuk menggunakan
cat /dev/urandom
langsung dalamcron
perintah, tetapi mungkin akan lebih mudah hanya untuk memindahkan apa yang saat ini Anda miliki ke skrip Bash terpisah.sumber
od -An -N1 -i /dev/urandom
\% 30); command$RANDOM
bukan bagian dari lingkungan "penuh". Ini tidak ada hubungannya dengan variabel lingkungan yang ditetapkan pada awal proses. Ini adalah variabel khusus yang dibuat "on the fly" di bash. Nilai baru selalu dihasilkan setiap kali variabel dibaca. ---cron
secara default menggunakannya/bin/sh
pada sistem/bin/sh
yang tidak ditautkanbash
$RANDOM
tidak akan berfungsi secara default.