View Full Version : [Solved] Services stop when upgrading ports?
xy16644
October 2nd, 2009, 08:34
One thing I have noticed when upgrading my ports is that after the upgrade is complete many services on my server have been stopped. Is this normal?
For instance, yesterday there were a couple ports that I upgraded and my Courier Authlib, Courier IMAP and SpamAssassin service was stopped.
Is this what happens when your ports are upgraded? Do I need to check ALL my services after upgrading my ports everytime?
SirDice
October 2nd, 2009, 09:07
That's normal. If a package is removed, the service is stopped. When a package is installed it's not started automatically.
xy16644
October 2nd, 2009, 14:08
Thank you!
I need to get into the habit of making sure all services are started after updating all my ports...
DutchDaemon
October 2nd, 2009, 14:10
Not all ports behave in exactly the same way. E.g. dovecot will ask you whether to stop the service or not. MySQL on the other hand simply stops the service, without giving any feedback about it. So yes, always check.
xy16644
October 2nd, 2009, 14:14
Yeah, I found that out the hard way! It stopped my authlib and IMAP services and people couldn't login to web mail anymore for a few hours. It had me puzzled until I went through the necessary logfiles...
Thanks for the advice.
DutchDaemon
October 2nd, 2009, 14:22
for script in /usr/local/etc/rc.d/*
do
$script restart
done
;)
xy16644
October 2nd, 2009, 14:24
That looks helpful!
Do I just copy that into a file and run it after I have run the upgrade of the ports?
DutchDaemon
October 2nd, 2009, 14:26
Sure! Might be better to fine-tune it a little instead of just restarting everything. Lemme work on that and get back to you here.
xy16644
October 2nd, 2009, 14:27
What if you just say start the services that are stopped:
for script in /usr/local/etc/rc.d/*
do
$script start
done
Or have I over simplified it? :e
dennylin93
October 2nd, 2009, 14:40
Sure! Might be better to fine-tune it a little insetad of just restarting everything. Lemme work on that and get back to you here.
It should only start the services that are enabled it /etc/rc.conf, so there shouldn't be a problem.
DutchDaemon
October 2nd, 2009, 14:43
#!/bin/sh
for script in /usr/local/etc/rc.d/*; do if $script rcvar | grep -q "=[yY][eE][sS]" && \
$script status | grep -q 'not running'; then $script start; fi; done
This will only start services defined in /etc/rc.conf ("yes", "YES", combinations thereof) which are not running now. Ports-based services only, of course.
xy16644
October 2nd, 2009, 14:46
Wow thanks! I'm glad you wrote that.
I created a file called restart and pasted everything into it but when I run it as follows:
./restart
It says: Permission denied (while I am logged in as root)
DutchDaemon
October 2nd, 2009, 14:48
Make it executable ;) (chmod 500 should suffice).
xy16644
October 2nd, 2009, 14:49
Sorry blonde momoent, I had to run chmod 700 on it!
It works like a charm! I stopped my ClamAV service and it restarted it...thank YOU!!
xy16644
October 2nd, 2009, 14:54
How do I put a comment in the script so I know what this script does for when I look at the code in the future?
DutchDaemon
October 2nd, 2009, 14:56
Just put a line in there starting with '#' (without the quotes).
xy16644
October 2nd, 2009, 14:58
Thats what I did and it says:
for: Command not found.
script: Undefined variable.
The script looks as follows now (I used your comments):
#This will only start services defined in /etc/rc.conf ("yes", "YES", combinations thereof)
#which are not running now. Ports-based services only, of course.
#!/bin/sh
for script in /usr/local/etc/rc.d/*; do if $script rcvar | grep -q "=[yY][eE][sS]" && $script status | grep -q 'not running'; then $script start; fi; done
DutchDaemon
October 2nd, 2009, 15:01
Put those two comments at the bottom of the script. This looks like (t)csh. It may be a bit picky when it comes to the location of the hashbang (the magic '#!' invocation). Other shells care less, but I guess (t)csh wants it front and center, i.e. at the start of the first line.
DutchDaemon
October 2nd, 2009, 15:08
Final note: not all rc.d scripts appear to have the 'status' command. E.g. I found this one:
/usr/local/etc/rc.d/mailman: unknown directive 'status'.
Usage: /usr/local/etc/rc.d/mailman [fast|force|one](start|stop|restart|rcvar|reload)
So if you ever encounter one of those you'll have to check it by hand. Of course, I could just make the script increasingly/eerily adaptive and over half a page long ;)
xy16644
October 2nd, 2009, 16:48
I moved the comments to the end and all worked like a charm.
I think you wrote an awesome script in only 2 lines...;-)
DutchDaemon
October 2nd, 2009, 17:29
Cheers!
xy16644
May 5th, 2012, 14:56
Sorry to open this thread up again but the script I have been using to restart services that have stopped due to a port being upgraded no longer works :(
I'm still running:
#!/bin/sh
for script in /usr/local/etc/rc.d/*; do if $script rcvar | grep -q "=[yY][eE][sS]" && \
$script status | grep -q 'not running'; then $script start; fi; done
But even after running this, I still find that there are services that are in a stopped state and I have to start them up manually.
What would have caused this script to stop working?
What would have caused this script to stop working?
Could be anything. What services actually are they?
Try first to run those services in the correct order:
for script in `rcorder /usr/local/etc/rc.d/* 2>/dev/null`; do ..
Maybe they depend also on then stopped /etc/rc.d/* services?
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.