スクリプトはcrontab経由では実行されませんが、スタンドアロンで正常に動作します


51

uptime3日以上経過した場合にコンピューターを再起動するように通知するスクリプトがあります(ただし、コンピューターが1日以上稼働しているためにスクリプトが実行されているかどうかを確認するためだけに0日に設定されています)。

私はそれが最もエレガントなスクリプトではないことを理解していますが、私は試みています! :)

#!/bin/bash

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

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

私はそれを実行可能にしchmod + x checkup.sh、それを介して端末から実行すると正常に動作します./checkup.sh

このスクリプトのcrontabエントリは次のとおりです。

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

したがって、毎日14時46分に実行されます。

だから...私は本当に愚かなことをしなかった場合を除き、実行する必要があると考えています。また、このbashスクリプトを移動しても大丈夫だと思います/binか?


1
パッケージが物事を考える場所を混乱させないために、一般的なベストプラクティスとして/ opt / binまたは〜/ binに配置します。
RobotHumans

次のようにスクリプトを実行すると:/home/dnaneet/Desktop/./checkup.shは機能しますか?/home/dnaneet/Desktop/checkup.sh
LnxSlck

@LnxSlckはい、実行は正常に動作/home/dnaneet/Desktop/./checkup.shします。しかし、/home/dnaneet/Desktop/checkup.sh正しく動作しない可能性がありますか?それが必要なのは./
親愛なる

1
cronはXセッションについて何も知らないと思います。
グレンジャックマン

@glennjackmanそれではどういう意味ですか?そのようなスクリプトをcrontabで実行しても、ポップアップメッセージがgnome環境に表示されないことを意味しますか?
親愛なる

回答:


71

一度に一つのことを:

まず、ユーザーベースのbinフォルダーを提供しましょう。

cd ~/ && mkdir bin

crontabを使用します。本当にシンプルなものから始めましょう:

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

さて、それでうまくいきます

次に、同じことを行うスクリプトを実行してみましょう

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

動作するまで1分間に1回実行します
いいえ、行の途中に./は必要ありません。./は、相対URLを指定する場合に使用します。
さて、それでうまくいきます

次に、xmessageを呼び出すスクリプトを実行してみましょう

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

働いていない

まず、環境変数に依存しないようにする必要があります。これには、パス設定、x11設定などが含まれます(pythonおよびruby環境変数が思い浮かびます...)

anacronの適切なcronファイルのように見せましょう。これをテストとして保存しました

#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

毎分実行するように設定

crontab test インポートする

スクリプトについて

#!/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!"`

さて、それでうまくいきます...私たちは何をしましたか?
明示的に設定しなかったパスに依存しないようにすべてのコマンドを変更しました
bash
を使用してスクリプトを明示的に実行しましたDISPLAY:0.0にあることをスクリプトに伝えました


答えてくれてありがとう。「アナクロンの適切なcronファイルに少し似せてみましょう。これをテストとして保存しました」。crontabファイル?:-/
親愛なる

私が観察したことはここにあります。最初に=、を指定する行の前後のスペースを削除する必要がありましたDISPLAY。第二に、crontabファイルを編集してPATH、提案どおりにを追加し、後で実行する時間を設定すると、ポップアップウィンドウが表示されませんでした。ただし、/bin/bash... を使用してスクリプトを実行すると、ポップアップウィンドウは問題なく表示されました。
親愛なる

スクリプトをに変更するとexport DISPLAY=:0.0、うまくいきました。ポップアップウィンドウが表示されるはずだった時間を時計が鳴らした後、約5秒の大きなラングがありましたが...何か提案はありますか?しかし、はい、スクリプト作業の修正です!
親愛なる

5秒遅れについてはわかりません。
-RobotHumans

3
私はあなたがこのステップを一歩一歩進んで、それを要約した方法が大好きです-ありがとう!
jbobbins 16

10

Googleのマニュアルを読んで問題を解決しました。

説明:

  1. #!/bin/bashヘッダーとして 使用するスクリプトがあります
  2. 私はスクリプトを置きます /home/wc3/palert/

分析:

  1. crontabでスクリプトを実行できません
  2. しかし、手動で実行すると、出力が表示され、Webで結果を見ることができます
  3. スクリプトフォルダでスクリプトを実行するときとは異なり、crontabは環境を取得できないことを意味します

回答:

  1. 以下の行を使用してスクリプトに環境を設定します:

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

    これを変更します:/home/wc3/palert
    with:スクリプトを置く場所/home/budi/script.sh

サンプル:

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

スクリプトをcrontabに配置してみてください。


私のために動作しません
ジョンジョー

私にとって魅力的な仕事です!
1rq3fea324wre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.