Script tidak dijalankan melalui crontab tetapi berfungsi dengan baik secara mandiri

51

Saya memiliki skrip yang mengingatkan saya untuk me-restart komputer saya jika uptimelebih dari, katakanlah 3 hari (walaupun diatur ke 0 hari sekarang hanya untuk memeriksa apakah skrip berjalan karena komputer saya telah menyala hanya lebih dari satu hari ..).

Saya menyadari itu bukan skrip paling elegan tapi saya mencoba! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Saya telah membuatnya dapat dieksekusi oleh chmod + x checkup.shdan berfungsi dengan baik ketika saya menjalankannya dari terminal via./checkup.sh

Entri crontab saya untuk skrip ini adalah:

46 14 * * * /home/username/Desktop/./checkup.sh

Jadi itu berjalan pada 14: 46 jam setiap hari ...

Jadi ... saya pikir itu harus berjalan, kecuali saya tidak melakukan sesuatu yang sangat konyol. Juga, apakah menurut Anda tidak masalah untuk memindahkan skrip bash ini /bin?

sayangku
sumber
1
Saya akan meletakkannya di / opt / bin atau ~ / bin sebagai praktik umum terbaik untuk tidak mengacaukan di mana paket berpikir segalanya.
RobotHumans
Jika Anda menjalankan skrip seperti: /home/dnaneet/Desktop/./checkup.sh apakah itu berfungsi? Saya akan meletakkan /home/dnaneet/Desktop/checkup.sh
LnxSlck
@ LnxSlck Ya, menjalankan /home/dnaneet/Desktop/./checkup.shberfungsi dengan baik. Tapi /home/dnaneet/Desktop/checkup.shmungkin tidak berhasil kan? Karena itu perlu ./?
dearN
1
Saya tidak berpikir cron tahu apa-apa tentang sesi X Anda.
glenn jackman
@glennjackman Jadi apa artinya itu? Apakah itu berarti menjalankan skrip seperti itu melalui crontab tidak memungkinkan pesan pop up muncul di lingkungan gnome?
dearN

Jawaban:

71

Satu hal dalam satu waktu:

Pertama mari kita beri Anda folder bin berbasis pengguna:

cd ~/ && mkdir bin

Anda ingin menggunakan crontab. Mari kita mulai dengan sesuatu yang sangat sederhana:

* * * * * touch /tmp/testing.txt

Oke, jadi itu berhasil

Sekarang mari kita coba menjalankan skrip yang melakukan hal yang sama

* * * * * /home/username/bin/touchtest.sh

untuk menjalankan satu menit sekali sampai Anda berhasil
Tidak, Anda tidak perlu ./ di tengah-tengah garis. ./ adalah untuk saat Anda memberikan url relatif.
Oke, jadi itu berhasil

Sekarang mari kita coba menjalankan skrip yang memanggil xmessage

* * * * * /home/username/bin/rebootwarn.sh

tidak bekerja

Pertama, kita tidak perlu bergantung pada variabel lingkungan. Ini termasuk pengaturan path, pengaturan x11, atau yang lainnya (variabel lingkungan python dan ruby ​​muncul di benak ...)

Mari kita buat kita terlihat sedikit seperti file cron yang tepat anacron .. Aku menyimpan ini sebagai tes

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Setel untuk berlari satu menit sekali

crontab test untuk mengimpornya

Aktif ke skrip

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Oke, jadi itu berhasil ... apa yang kita lakukan?
Kami mengubah semua perintah untuk tidak bergantung pada jalur yang tidak kami atur secara eksplisit.
Kami menjalankan skrip kami secara eksplisit dengan bash.
Kami memberi tahu skrip yang kami harapkan ada di DISPLAY: 0.0

RobotHumans
sumber
Terima kasih atas jawabannya. Anda berkata "Mari kita buat kita terlihat seperti file cron yang tepat anacron .. Aku menyimpan ini sebagai ujian" .. KAMI apa? File crontab? :-/
dearN
Inilah yang saya amati. Pertama, saya harus menyingkirkan ruang sebelum dan sesudah =untuk menentukan baris DISPLAY. Kedua, ketika saya mengedit file crontab saya dan menambahkan PATHseperti yang disarankan dan mengatur waktu untuk menjalankan di lain waktu, jendela pop up tidak muncul. Namun, jendela sembulan menunjukkan baik-baik saja ketika menjalankan skrip menggunakan /bin/bash... apa yang terjadi?
dearN
Apa yang Anda tahu, setelah saya mengubah skrip saya export DISPLAY=:0.0, itu berfungsi dengan baik. Meskipun ada lang signifikan sekitar 5 detik setelah jam berdentang jam ketika jendela pop up saya seharusnya menunjukkan ... Ada saran? Tapi ya, perbaikan naskahmu sudah berhasil!
dearN
Tidak ada ide tentang lag 5 detik.
RobotHumans
3
Saya suka cara Anda melewati langkah demi langkah dan kemudian merangkumnya - terima kasih!
jbobbins
10

Masalahnya terpecahkan, baca manual di Google:

deskripsi:

  1. Saya menggunakan skrip #!/bin/bashsebagai header
  2. Saya meletakkan script /home/wc3/palert/

analisis:

  1. crontab tidak dapat menjalankan skrip saya
  2. Tetapi jika saya menjalankan secara manual itu menunjukkan output dan juga saya bisa melihat hasilnya di web saya
  3. Itu berarti crontab tidak bisa mendapatkan lingkungan yang tidak disukai ketika Anda menjalankan skrip pada folder skrip Anda

menjawab:

  1. letakkan lingkungan Anda menggunakan baris ini di bawah pada skrip Anda dengan:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    ubah ini: /home/wc3/palert
    dengan: tempat Anda meletakkan skrip Anda misalnya/home/budi/script.sh

Sampel:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Coba letakkan skrip Anda di crontab.

budi satriyo
sumber
tidak bekerja untuk saya
John Joe
Bekerja seperti pesona bagiku!
1rq3fea324wre