How to add a line into rc.local with shell
Asked Answered
D

3

18

I am working on a Ubuntu 12.04 and writing a environment-auto-build shell. In the shell I need to change something in rc.local.

This is my rc.local now.

#!/bin/sh -e
#......

exit 0

I want to modify it like this:

#!/bin/sh -e
#......

nohup sh /bocommjava/socket.sh &

exit 0

Now I use nano to modify it, is there any command that can insert the line into rc.local?

Dauphin answered 12/7, 2013 at 2:2 Comment(5)
Have you considered raising this question on askubuntu as well?Kirschner
@wleoncio um... Good advise. but do they allow me to publish my question at two site?Dauphin
I guess so, at least I've never had any problems doing that. ;)Kirschner
@wleoncio I've got a good answer, but finally I decided to use crond(@reboot) to start my socket program. I've learned several ways to do it, so I think there is no need to post another question. Thank you anyway.Dauphin
Good for you! Still, since we're on the subject, if you want to go ahead and post the question there along with the answer (you can do that in stackoverflow too), it's highly encouraged: stackoverflow.com/help/self-answerKirschner
R
35

Use Sed

For Test

sed -e '$i \nohup sh /bocommjava/socket.sh &\n' rc.local

Really Modify

sed -i -e '$i \nohup sh /bocommjava/socket.sh &\n' rc.local
Rabkin answered 12/7, 2013 at 10:5 Comment(3)
yes, this command works. But what does $i mean? I checked many sed article, didn't found the answer. Thank u so much!Dauphin
$i should be divide into '$' and 'i'. '$' means the last line, 'i' means insert before the current line, so '$i' means insert before the last line.Rabkin
You might want to check if [ "`tail -n1 /etc/rc.local`" != "exit 0" ]; then ... in case someone has appended a blank line. — It wouldn't be fun to notice some weeks later that the service actually didn't restart, when the machine was rebootedArber
S
1

The easiest would be to use a scripted language (ex: python, perl, etc...).

#!/usr/bin/env python
import os

with open('/etc/rc.local') as fin:
    with open('/etc/rc.local.TMP') as fout:
        while line in fin:
            if line == 'exit 0':
                fout.write('nohup sh /bocommjava/socket.sh &\n')
            fout.write(line)

# save original version (just in case)
os.rename('/etc/rc.local', '/etc/rc.local.jic')

os.rename('/etc/rc.loca.TMP', '/etc/rc.local')
Susurration answered 12/7, 2013 at 2:11 Comment(2)
Well, this works fine, but I still want a shell solution. Thanks a lot!Dauphin
Quite a bit more code in basic shell. Check out bash.cyberciti.biz/file-management/read-a-file-line-by-lineSusurration
T
0

Find exit 0 and remove it.
Append new line with exit 0 in the end.

file=/etc/rc.local
search="exit 0"
newLine="nohup sh /bocommjava/socket.sh &"

# Remove exit 0
sudo ex -s +"g/$search/d" -cwq $file

# Find line
found=$(cat $file | grep "$newLine")

# Remove if exist
if [ "$found" != "" ]; then
    sudo ex -s +"g/$found/d" -cwq $file
fi

# Append lines
sudo echo $found >> $file
sudo echo $search >> $file
Trigraph answered 11/3 at 21:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.