次のようなスクリプトを作成したいと思います。一日のうちの特定の時間に始まり、別の特定の時間に終わります。
たとえば、テストしたいプログラムがあるため、スクリプトは午後10時に起動し、午前9時まで実行し続けるように設定されています。
これは、プログラムを継続して実行することについて私が持っていた別の質問の続きです。
私は以下を持っています:
#!/bin/bash
trap "echo manual abort; exit 1" 1 2 3 15;
RUNS=0;
while open -W /Path/to/Program.app
do
RUNS=$((RUNS+1));
echo $RUNS > /temp/autotest_run_count.txt;
done
exit 0
このスクリプトはデフォルトでMac OSXで私のプログラムを実行し、エラーをキャッチします。それ以外の場合は、プログラムが閉じたときにプログラムを再実行します。
上記のように実行したいと思います。午後10時に始まります。午前9時に終了します。
あなたのアドバイスは常に便利です。
ありがとうございます!
ユデン
答え1
起動時に一度実行でき、午後9時から午前9時の間にタスクを実行できるようにスクリプトを拡張しました。
#!/bin/bash -·
LOGFILE="/tmp/autotest_run_count.txt"
trap "echo manual abort; exit 1" 1 2 3 15
RUNS=0
while [ 1 ] ; do·
HOUR="$(date +'%H')"
if [ $HOUR -ge 21 -a $HOUR -lt 9 ] ; then
# run program
libreoffice || exit 1
RUNS=$((RUNS+9))
echo $RUNS > $LOGFILE
else
echo $RUNS, waiting H=$HOUR > $LOGFILE
# note: calculating the time till next wakeup would be more
# efficient, but would not work when the time changes abruptly
# e.g. a laptop is suspended and resumed
# so, waiting a minute is reasonably efficient and robust
sleep 60
fi
done
答え2
私はこのスクリプトを使います。与えられた時間に別のスクリプトを起動し、別の与えられた時間に停止します。この間、スクリプトがまだ実行されているか定期的にチェックし、そうでない場合は再起動します。必要に応じて、開始時間、停止時間、スクリプト名、および使用されるシェルを変更し、関連する「while」行(日付+時間または時間のみ)をコメントアウトします。
#!/bin/bash
if [ "$1" = "go" ]; then
starttime1=0900 #e.g. 201712312355 for date+time or 1530 for time
stoptime1=1100
scriptname1="./myscript"
# wait for starttime
echo "Waiting for " "$starttime1" " to start " "$scriptname1";
#while [ $(($(date +"%Y%m%d%H%M") < $starttime1)) = 1 ]; do #day and time
while [ $((10#$(date +"%H%M") != 10#$starttime1)) = 1 ]; do #just time. 10# forces following number to be interpreted as base 10. Otherwise numbers with leading zero will be interpreted as octal and this causes errors.
sleep 10;
done;
# run target script
lxterminal -e "$scriptname1";
# check if the target script is running, until the stoptime is reached and restart it if necessary
echo "Waiting for " "$stoptime1" " to stop " "$scriptname1";
#while [ $(($(date +"%Y%m%d%H%M")<$stoptime1)) = 1 ]; do #day and time
while [ $((10#$(date +"%H%M") != 10#$stoptime1)) = 1 ]; do #just time. 10# forces following number to be interpreted as base 10. Otherwise numbers with leading zero will be interpreted as octal and this causes errors.
sleep 10;
if [ -z $(pidof -x "$scriptname1") ]; then
echo "script was stopped.";
lxterminal -e "$scriptname1";
fi;
done;
# end the target script when the stoptime is reached
kill $(pidof -x "$scriptname1");
echo "ok.";
else
lxterminal -e "$0" go;
exit;
fi