Estou tentando criar um serviço para monitorar uma página da web. O script é executado bem quando eu o executo como root
sudo ./myscript.sh.
Mas quando eu o adiciono como um serviço, a parte de e-mail funciona, mas a função sms não. Também nada é registrado.
Meu código de inicialização está abaixo;
cat /etc/init.d/glastowatch
#!/bin/sh
### BEGIN INIT INFO
# Provides: glastowatch
# Required-Start: $local_fs $network $named $time $syslog
# Required-Stop: $local_fs $network $named $time $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: http page monitor
### END INIT INFO
SCRIPT=/usr/local/bin/glastowatch.sh
RUNAS=root
PIDFILE=/var/run/glastowatch.pid
LOGFILE=/var/log/glastowatch.log
start() {
if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then
echo 'Service already running' 2>&1
return 1
fi
echo 'Starting service…' 2>&1
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
su -c "$CMD" $RUNAS > "$PIDFILE"
echo 'Service started' 2>&1
}
stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Service not running' 2>&1
return 1
fi
echo 'Stopping service…' 2>&1
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Service stopped' 2>&1
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
Meu código de script está abaixo;
cat /usr/local/bin/glastowatch.sh
#!/bin/bash
## monitor.sh - Monitors a web page for changes
## sends an email & sms notification if the file change
## script variables
URL="http://glastonbury.seetickets.com/content/extras"
newhtml="/var/tmp/new.html"
oldhtml="/var/tmp/old.html"
newupdate="/var/tmp/updatenew.txt"
oldupdate="/var/tmp/updateold.txt"
logfile="/var/log/glastowatch.log"
## email addresses to send email to
declare -a emails=(
'[email protected]'
'[email protected]'
);
## phone numbers to send sms to
declare -a numbers=(
'xxxxx262050'
);
## message variable
message="Web Page Changed."
## sms system variables
test="false"
## functions
function send_sms {
smstxt="$1"
smstest="$2"
for num in "${numbers[@]}"
do
php sms.php "${num}" "${smstxt}" "${smstest}"
done
}
function send_email {
mailbody="$1"
mailsubject="$2"
for addy in "${emails[@]}"
do
echo "$mailbody" | mail -s "$mailsubject" "$addy"
done
}
## main loop
for (( ; ; )); do
curl -I $URL -Ls | grep "Last-Modified" > $newupdate
DIFF_OUTPUT1="$(diff $newupdate $oldupdate)"
if [ "${#DIFF_OUTPUT1}" != "0" ]; then
curl $URL -L --compressed -s | sed -E \
-e 's/data-refresh-id="[0-9.]+"/data-refresh-id="0"/' \
-e 's/serverTime: [0-9]+/serverTime: 0/' \
-e 's/.*<meta charset="UTF-8" \/>.*/<meta charset="UTF-8" \/>/' > $newhtml
DIFF_OUTPUT2="$(diff $newhtml $oldhtml)"
if [ "${#DIFF_OUTPUT2}" != "0" ]; then
## build text string for email body
hash='cat $newupdate'
text="The following changes have been made to $URL"$'\n'$'\n'"${DIFF_OUTPUT2}"$'\n'$'\n'"$hash"
send_email "$text" "$message"
smsmsg="$message"$'\n'$'\n'"$URL"$'\n'$'\n'"$hash"
send_sms "$smsmsg" "$test" > $Logfile 2>&1
mv $newhtml $oldhtml 2> $logfile
fi
mv $newupdate $oldupdate 2> $logfile
fi
sleep 30
done
e isso, por sua vez, chama um script php de envio de SMS
cat /usr/local/bin/sms.php
<?php
// Textlocal account details
$username = '[email protected]';
//$password = 'xxxxx'
$hash = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// Configuration Variables
//$info = '0';
$test = $argv[3];
// Message details
$numbers = array($argv[1]);
$sender = urlencode('Pavey.Server');
$message = rawurlencode($argv[2]);
$numbers = implode(',', $numbers);
// Prepare data for POST request
$data = array('username' => $username, 'hash' => $hash, 'numbers' => $numbers, "sender" => $sender, "message" => $message, "test" => $test);
//Send the POST request with cURL
$ch = curl_init('http://api.txtlocal.com/send/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// Process your response here
echo $response;
?>
Como eu disse tudo isso funciona bem se eu apenas chamar o roteiro. Mas eu não recebo um SMS quando iniciado como serviço. Também textlocal não registra um pedido de mensagem. Talvez alguns registros ajudem a identificar o erro. Quando eu executo o script eu vejo uma saída da função SMS, então eu gostaria de registrar isso de alguma forma.
Obrigado chris.
Tags init sms ubuntu init-script