I had created a deamon in centos 7 to send an email from email queue.
Email queue is implemented in Yii1. That works fine but when I tried to create and run daemon in server but it fails and shows an error :
echo "Error! Could not start MyStaging!"
I am following instructions which I found here.
On inspection I found that PID gets the value 1232 and pgrep -u $RUNAS -f $NAME > /dev/null command returns empty.
Below is my script:
#!/bin/bash
### BEGIN INIT INFO
# Provides: MyStaging
# 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: This service having purpose to send email from email queue where relevant email push by particular module operation in queue.
### END INIT INFO
SCRIPT="/usr/bin/php5 /home/my/public_html/staging/protected/yiic mailqueue run"
RUNAS=root
NAME=MyStagingMailQueue
PIDFILE=/var/run/$NAME.pid
LOGFILE=/var/log/$NAME.log
start() {
if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
echo 'Service already running' >&2
return 1
fi
echo 'Starting service ' >&2
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
# su -s /bin/sh $RUNAS -c "$CMD" > "$PIDFILE"
# Try with this command line instead of above if not workable
su -c "$CMD" $RUNAS > "$PIDFILE"
sleep 2
PID=$(cat $PIDFILE)
if pgrep -u $RUNAS -f $NAME > /dev/null
then
echo "$NAME is now running, the PID is $PID"
else
echo "Error! Could not start $NAME!"
fi
}
stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Service not running' >&2
return 1
fi
echo 'Stopping service ' >&2
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Service stopped' >&2
}
status() {
printf "%-50s" "Checking $NAME..."
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
if [ -z "$(ps axf | grep ${PID} | grep -v grep)" ]; then
printf "%s\n" "The process appears to be dead but pidfile still exists"
else
echo "Running, the PID is $PID"
fi
else
printf "%s\n" "Service not running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
I don't know what is the issue. Please help me sort it out.
Since you're using CentOS 7, it's better to create a systemd service.
Step1:
Create a service file for your service say yiicmail.service. Do :
sudo touch /etc/systemd/system/yiicmail.service
Step2:
Open the the above file with your favourite editor and put the below content in it:
[Unit]
Description=yiic service
After=network.target
[Service]
Type=simple
User=root
ExecStart="/usr/bin/php5 /home/whizbite/public_html/staging/protected/yiic mailqueue run"
#If there are spaces, I would strings within quotes like above
Restart=on-abort
[Install]
WantedBy=multi-user.target
Step3:
Now it is the time to play with the service. To start it, do :
sudo systemctl start yiicmail # You don't have to type full name, that is, yiicmail.service
To check the status, do :
sudo systemctl status yiicmail
To stop it, do :
sudo systemctl stop yiicmail
To start the service at boot, do :
sudo systemctl enable yiicmail
To disable the service at boot, do:
sudo systemctl disable yiicmail
Hope this helps.
Related
I'm trying to start a service over ssh in a bash script that I just call from the command line. I can do the following commands: (I have ssh keys in place so I don't need to put a p/w in)
ssh -t -t user#server 'sudo /sbin/service test stop' -- Works fine, stops the service
ssh -t -t user#server 'sudo /sbin/service test status' -- Works fine, status's the service
ssh -t -t user#server 'sudo /sbin/service test start' -- Doesn't start the service ???
This is with a custom init.d script running on centos 6.7
Does anyone have any ideas?
or see what I might be missing?
Thanks!
EDIT: Here is the init.d script:
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: test
# Required-Start: networking
# Required-Stop: networking
# Default-Start: 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
### END INIT INFO
#
###source function library
source /etc/init.d/functions
APPNAME="test"
APPDIR="/tmp"
CONFIGDIR="/tmp/config"
LOCKFILE=/var/lock/subsys/$APPNAME
PIDFILE="/var/run/$APPNAME.pid"
###Declare variables for test
CONFIG="test.config"
start() {
echo -n "Starting $APPNAME: "
source "${CONFIGDIR}/source.txt"
daemon --pidfile="$PIDFILE" "/tmp/${APPNAME} ${CONFIGDIR}/${CONFIG} >> /tmp/console.log 2>&1 &"
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch $LOCKFILE
pidof $APPNAME > $PIDFILE
}
return $RETVAL
}
stop() {
echo -n $"Stopping $APPNAME:"
killproc -p "$PIDFILE" $APPNAME
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE $PIDFILE
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$PIDFILE" "$APPNAME"
;;
restart)
stop
start
;;
*)
echo "Usage $prg {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
I found a work around:
ssh -t -t user#server 'sudo bash -s' < '/tmp/start_test.sh'
and then on the server:
/tmp/start_test.sh
#!/bin/bash
sudo service test start >> /tmp/start.log
exit 0
I tested this one successfully:
echo "sudo service test start && exit" | python -c 'import pty, sys; pty.spawn(sys.argv[1:])' ssh user#server
I have install elasticsearch 2.3.3 in centos 7 but after closing terminal elasticsearch plugin head automatically close but I want keep running in background. please give me helpful answer.
You can run it in background as two ways,
1. Nohup
2. Creating service script and put it in init.d folder
Nohup
Eg: nohup ./bin/elasticsearch
Service script
Use the following script,
#!/bin/bash
### BEGIN INIT INFO
# Provides: Elasticsearch
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Runs elasticsearch daemon
# Description: Runs the elasticsearch daemon as a non-root user
### END INIT INFO
# Process name
NAME=elasticsearch
DESC="Elasticsearch"
PROG="/etc/init.d/elasticsearch"
# Configure location of Elasticsearch bin
ELASTICSEARCH_BIN=/opt/elasticsearch-2.3.0/bin
# PID Info
PID_FOLDER=/var/run/elasticsearch/
PID_FILE=/var/run/elasticsearch/$NAME.pid
LOCK_FILE=/var/lock/subsys/$NAME
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$ELASTICSEARCH_BIN
DAEMON=$ELASTICSEARCH_BIN/$NAME
# Configure logging location
ELASTICSEARCH_LOG=/var/log/elasticsearch.log
# Begin Script
RETVAL=0
if [ `id -u` -ne 0 ]; then
echo "You need root privileges to run this script"
exit 1
fi
# Function library
. /etc/init.d/functions
start() {
echo -n "Starting $DESC : "
pid=`pidofproc -p $PID_FILE elasticsearch`
if [ -n "$pid" ] ; then
echo "Already running."
exit 0
else
# Start Daemon
if [ ! -d "$PID_FOLDER" ] ; then
mkdir $PID_FOLDER
fi
daemon --user=$DAEMON_USER --pidfile=$PID_FILE $DAEMON 1>"$ELASTICSEARCH_LOG" 2>&1 &
sleep 2
pidofproc node > $PID_FILE
RETVAL=$?
[[ $? -eq 0 ]] && success || failure
echo
[ $RETVAL = 0 ] && touch $LOCK_FILE
return $RETVAL
fi
}
reload()
{
echo "Reload command is not implemented for this service."
return $RETVAL
}
stop() {
echo -n "Stopping $DESC : "
killproc -p $PID_FILE $DAEMON
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $PID_FILE $LOCK_FILE
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p $PID_FILE $DAEMON
RETVAL=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
# Invalid Arguments, print the following message.
echo "Usage: $0 {start|stop|status|restart}" >&2
exit 2
;;
esac
sudo chmod +x /etc/init.d/elasticsearch
sudo update-rc.d elasticsearch defaults 96 9
sudo /etc/init.d/elasticsearch restart
I created this init.d script for unicorn according to this digitalocean tutorial.
#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the unicorn app server
# Description: starts unicorn using start-stop-daemon
### END INIT INFO
set -e
USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"
# app settings
USER="deploy"
APP_NAME="appname"
APP_ROOT="/home/$USER/$APP_NAME"
ENV="production"
# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"
# make sure the app exists
cd $APP_ROOT || exit 1
sig () {
test -s "$PID" && kill -$1 `cat $PID`
}
oldsig () {
test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}
case $1 in
start)
sig 0 && echo >&2 "Already running" && exit 0
echo "Starting $APP_NAME"
su - $USER -c "$CMD"
;;
stop)
echo "Stopping $APP_NAME"
sig QUIT && exit 0
echo >&2 "Not running"
;;
force-stop)
echo "Force stopping $APP_NAME"
sig TERM && exit 0
echo >&2 "Not running"
;;
restart|reload|upgrade)
sig USR2 && echo "reloaded $APP_NAME" && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
$CMD
;;
rotate)
sig USR1 && echo rotated logs OK && exit 0
echo >&2 "Couldn't rotate logs" && exit 1
;;
*)
echo >&2 $USAGE
exit 1
;;
esac
Now (the script's name is uicorn_app)
sudo update-rc.d `unicorn_app` defaults
works. But whenever i try
$ sudo service unicorn_app start
Starting app
-su bundle: command not found
However i am able to stop it via
$ sudo service unicorn_app stop
after i started it manually with
RAILS_ENV=production rails s -b ip.ip.ip.ip
I installed ruby on rails on /etc/local via rbenv and the PATH
first entries redirect to the proper directories:
/usr/local/rbenv/shims
/usr/lcoal/rbenv/bin
What do i need to change that my scripts finds bundle? Since i think the PATH is correct what else could go wrong? Thanks in advance for help!
OK the solution was to do with the rbenv installation. I needed to add the lines PATH and RBENV_ROOT to my ~/.bash_profile. After adding them there i was able to start unicorn via sudo service unicorn_app start
supervise is one of the powerful tool in daemontools, I wonder how to implement it using bash script. Anyone has suggestions? I need help!
supervise performs a number of tasks, and interoperates with svscan, svcok, svstat.
A fully-featured implementation in bash would be non-trivial, but a daemon-restarting script is a fairly straight-forward task.
#!/bin/bash
DAEMON=/usr/sbin/whatever # "/bin/sleep" for demo
DAEMON_ARGS="xxx" # "15" for sleep demo
case "$1" in
start)
echo "Starting $DAEMON"
(
trap 'logger -i -p daemon.info "INFO: $DAEMON shutting down..."; exit 1' 1 2 3 15
logger -i -p daemon.info "INFO: Starting $DAEMON"
while : ; do
$DAEMON $DAEMON_ARGS &
pid=$!
echo $pid > /var/run/mydaemon.pid
wait $pid
rc=$?
logger -i -p daemon.warn "WARNING: $DAEMON exited, rc=$rc"
sleep 1 # adjust as required
logger -i -p daemon.warn "WARNING: Restarting $DAEMON"
done
) &
echo $! > /var/run/myscript.pid
;;
stop)
echo "Stopping $DAEMON"
[ -f /var/run/myscript.pid ] && kill $(</var/run/myscript.pid)
[ -f /var/run/mydaemon.pid ] && kill $(</var/run/mydaemon.pid)
;;
esac
The above has pretty much no error handling, doesn't properly do real daemon things like chdir() and close unused FDs, but it does log via logger/syslog so you can see what it's doing. It assumes $DAEMON does not fork into the background itself (as does supervise).
You haven't stated your platform, but if you want something really, really simple, inittab may do the trick, see how to use inittab to auto-restart a PHP programme? for some tips. Otherwise we're veering out of Stack Overflow territory, so check out https://unix.stackexchange.com/ .
I changed the code provided by mr.spuratic around a little bit:
echo "true" > $STATUSFILE
case "$1" in
start)
echo "Starting $DAEMON_NAME"
(
trap 'logger -t italoService "INFO: $DAEMON_NAME shutting down..."; exit 1' 1 2 3 15
logger -t italoService "INFO: Starting $DAEMON_NAME"
while : ; do
#do_start
read STATUS <$STATUSFILE
if [ "$STATUS" = "false" ] ; then
logger -t italoService "INFO: $DAEMON_NAME stopped by user"
break
fi
$DAEMON $DAEMON_OPTS &
pid=$!
echo $pid > $PIDFILE
logger -t italoService "WARNING: pid File: $pid"
wait $pid
rc=$?
logger -t italoService "WARNING: $DAEMON_NAME exited, rc=$rc"
sleep 1 # adjust as required
read STATUS <$STATUSFILE
if [ "$STATUS" = "true" ] ; then
logger -t italoService "WARNING: Restarting $DAEMON_NAME"
fi
done
) &
echo $! > $PIDFILE
;;
stop)
echo "Stopping $DAEMON_NAME"
echo "false" > $STATUSFILE
[ -f $PIDFILE ] && kill $(<$PIDFILE)
[ -f $PIDFILE ] && kill $(<$PIDFILE)
;;
I found this small shell script in a book... NGiNX works it just this script that just does not work. Because every time I do /etc/init.d/nginx start (that is where the file is) it sends me this message: Usage: /etc/init.d/nginx {start|stop|restart|reload}
For testing purposes I added a echo "$1" and it sends me -e when I do: /etc/init.d/nginx start Or anything else...
I am using Ubuntu 12.04.
#! /bin/sh
# Author: Ryan Norbauer http://norbauerinc.com
# Modified: Geoffrey Grosenbach http://topfunky.com
# Modified: Clement NEDELCU
# Reproduced with express authorization from its contributors
set –e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0
echo "0"
d_start() {
$DAEMON || echo -n " already running"
}
d_stop() {
$DAEMON –s quit || echo -n " not running"
}
d_reload() {
$DAEMON –s reload || echo -n " could not reload"
}
echo "$1"
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
reload)
echo -n "Reloading $DESC configuration..."
d_reload
echo "reloaded."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
# Sleep for two seconds before starting again, this should give the
# Nginx daemon some time to perform a graceful stop.
sleep 2
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
exit 3
;;
esac
exit 0
set –e is setting the list of arguments to the script to –e. Remove that line and the script will work.
Edit: The script posted contains set –e (that is EN DASH + e) as opposed to set -e (ASCII hyphen/minus sign + e). This caused sh to override the first argument passed with –e instead of setting the -e option in the shell. Replacing – with - should fix the problem.