# Services stop when upgrading ports?



## xy16644 (Oct 2, 2009)

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 (Oct 2, 2009)

That's normal. If a package is removed, the service is stopped. When a package is installed it's not started automatically.


----------



## xy16644 (Oct 2, 2009)

Thank you!

I need to get into the habit of making sure all services are started after updating all my ports...


----------



## DutchDaemon (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

```
for script in /usr/local/etc/rc.d/*
do
$script restart
done
```


----------



## xy16644 (Oct 2, 2009)

That looks helpful!

Do I just copy that into a file and run it after I have run the upgrade of the ports?


----------



## DutchDaemon (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

DutchDaemon said:
			
		

> 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 (Oct 2, 2009)

```
#!/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 (Oct 2, 2009)

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 (Oct 2, 2009)

Make it executable  (chmod 500 should suffice).


----------



## xy16644 (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

Just put a line in there starting with '#' (without the quotes).


----------



## xy16644 (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

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 (Oct 2, 2009)

Cheers!


----------



## xy16644 (May 5, 2012)

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?


----------



## aa (May 5, 2012)

xy16644 said:
			
		

> 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?


----------

