breaking into the unknown…

Leave a comment

Subdomain on localhost Rails

Our product is in production and we decided to have a new subdomain which will target a different set of Users. The end goal is to have the same Code base but render different CSS based on subdomain.

Since our App is hosted on Heroku, the first thing I do is checked feasibility of two DNS pointing to same app, I raised the below ticket on heroku:

Heroku Confirmed that it is quite easy to do, so now we move ahead with the development.

Here the first problem is to get two URL pointing to our same App in local.

We all know and use below URL in local:


We need another URL as below:


You can achieve this with below steps:

1 – Login as admin user on terminal:

sudo su –

2 – Edit /etc/hosts file

nano /etc/hosts

The above command will open /etc/hosts file for you in terminal.

You will find few lines there, the important one is: localhost

This is the line which basically map localhost to IP

Add a new line below it: MBEportal.localhost

This is telling that the new DNS MBEportal.localhost should also map to IP

press cntr + x to exist editing

It will ask you to save before existing. Press Y to save the change.

3 -restart your rails server.

Now you can access your localhost at both the below URL



4 – Parse Subdomain in Controller

So, at this point we have  simulated subdomain behavior. Also both hitting same code base as expected.

But still when I go to controller action and try to see subdomain, it return empty array

request.subdomains -> []

It look like our server treating http://MBEportal.localhost as a single domain.

This can be fixed by adding below line in environment/development.rb file

config.action_dispatch.tld_length = 0

Restart your server again and this time you will get the subdomain from URL

request.subdomains -> [“mbeportal”]

great ! now we can find the subdomain from request object and thus execute different logic or layout or any other thing specific to the particular domain.

Some other detail which you can read from request object are:

request.base_url -> http://MBEportal.localhost:3000 -> mbeportal.localhost
request.domain -> localhost



1 Comment

ruby plugins for netbeans

Netbeans has removed ruby support since version 7.0 . So now it do not come inbuilt with Netbeans 7.0 or 7.3 or 8.0 or any other higher version, but still available as plugin from ruby community.

You can add it with below simple steps :

=> Start your Netbeans IDE

=> Go to  Tools -> Plugins -> Settings

=> Click Add on the setting page. It will open a new window for you and provide fields to enter plugin name and URL

=> Name it ruby (you can give any name you want) . within the URL provide below.

=> click O.K to complete the plugin addition

=> Now click on Available Plugins tab and search for ruby or whatever name you have given to the plugin.

=> The ruby plugin will be listed in the search, click it to select and you will see install button appear at the bottom

=> just click install and follow the instruction like accept agreement, click next etc

If you do not get next button at any stage, it may be due to some missing dependency .

Earlier I was using some other URL for the plugin

and getting below message in the installation window with the next button inactive

plugin is requested in version 1.0

If you face similar problem.. read this blog

=> You are done, now you can use netbeans for your Ruby development as usual…. Be Happy 🙂



1 Comment

JRE not installed or Java is disabled Firefox

This error is given by browser while trying to load any java Applets , if java plugin is not installed for that browser. I will explain it in terms of firefox on ubuntu 14.04 having 64 bit architecture .

STEP 1: check the installed plugin in firefox

Type about:plugins in the firefox URL and hit enter . It will show you all the currently, installed plugin .

If you see the below detail :

IcedTea-Web Plugin (using IcedTea-Web 1.5 (1.5-1ubuntu1))

    Path: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/
    State: Enabled
    The IcedTea-Web Plugin executes Java applets.

It means, you already have the plugin. But if it is so, You would have not reached here 🙂


STEP 2: Install JAVA

Ubuntu support openjdk directly and can be easily installed with apt-get command as below

arun@arun-desktop:~$ sudo apt-get install openjdk-7-jdk

Now you can verify the installed java as below.

arun@arun-desktop:~$ which java
arun@arun-desktop:~$ java -version
java version “1.7.0_55”
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)


STEP 3: Install icedtea plugin

Firefox is default browser with ubuntu. when you install ubuntu it automatically install Firefox to /usr/lib/mozilla folder. let us inspect this folder.

arun@arun-desktop:~$ cd /usr/lib/mozilla
arun@arun-desktop:/usr/lib/mozilla$ ls
extensions  plugins
arun@arun-desktop:/usr/lib/mozilla$ cd plugins/
arun@arun-desktop:/usr/lib/mozilla/plugins$ ls

So, there nothing seem related to java … O.K let us install it. But wait, icedtea depend on java version: Java 1.6 will require icedtea6-plugin, Java 1.7 icedtea-7-plugin. Since we have 1.7 version as seen in step 2 above we will install as below.

Also, icedta depend on openjdk, If you have sunjava jdk, it will not installed

arun@arun-desktop:~$ sudo apt-get install icedtea-7-plugin

That’s all, if you again check /usr/lib/mozilla/plugins folder you can find added there.

Restart your firefox, your java plugin will be available now



Leave a comment

browser not laoding any wab page

Recently, I get into strange problem, none of the browser I have on my ubuntu system: – firefox, chrome, internet explorer loading any of the web page, not even get loaded. I tried to ping google from terminal but still no result. This problem generally occur if your internet conection is down. But my internet is up as I can see the connection icon up there on Right hand side of my system, Infact I can login to skype and chat with my friends. So, No doubt the problem is not with the Internet connection. Then what the hell going on here…..???

I uninstalled and installed back firefox, but issue remain same. Looking back, I realised that, everything is working when I left the office in night, so it must have to do something with VPN connection I was using last night, may be it is the culprit. Finally, I got the solution by googling for hours

SOLUTION: delete etc/resolv.conf file and create it back. restarting the browser will solve the problem

You better backup the file before deleting it as you may need to see  it back if someone has made some custom change to this and want you to restore the things back.

arun@arun-yadav:~$ sudo su – # you need to be root user to edit file in etc
[sudo] password for arun: #your password
root@arun-yadav:~# cd /etc/ # moved to etc folder
root@arun-yadav:/etc# cat resolv.conf # let us see the content of this file
root@arun-yadav:/etc# rm resolv.conf # delete the file
root@arun-yadav:/etc# touch resolv.conf # create the file again
root@arun-yadav:/etc# cat resolv.conf # try to see the content after running the browser, it is empty.

Recently, I am on a system with Ubuntu 15.1 . Here resolv.conf is not a normal file but a symlink file pointing to /run/resolvconf/resolv.conf , so unlike older version, here after deleting the /etc/resolv.conf file we need to recreate as symlink pointing to /run/resolvconf/resolv.conf .

root@arun-yadav:/etc# ln -s  /run/resolvconf/resolv.conf resolv.conf

If the problem still exist, check the content of /etc/hosts file. In my case, it look as below.

# BEGIN hosts added by Network Connect
# END hosts added by Network Connect       localhost       rorexpert

You can see at top that, added by Network connect. It get deleted automatically when you logout of VPN, since you didn’t logged out and shut down the system or the VPN crashed, the above line failed to delete. So delete them, so that it look as below       localhost       rorexpert

Now restart the network with below command.

sudo /etc/init.d/networking restart

close the browser and start it again. It will work now .


PROBLEM : Internet up skype working but browser not laoding any wab page
The content of resolv.conf file is getting added by juniper, which provide VPN(virtual private network) for the financial website Iam working on. When I started juniper and again see the file, I see the both entry again.
root@arun-yadav:/etc# cat resolv.conf

Now, I logout of the juniper and try to see this file again

root@arun-yadav:/etc# cat resolv.conf #it print nothing

I read about resolv.conf file here and try to make some sense of the problem with which I was pulling my hair.I do not know exactly, but can make out below explanation:

when you request a page say,Then name server (often known as DNS) on your system will resolve to its IP address. generally, if nothing specified in resolv.conf file, the nameserver will be assumed to be that of localhost running at port 53. But, if you define it in resolv.conf file,it will be regarded as nameserver for your system, Infact If you give multiple nameserver in resolv.conf file, they will be tried in that order i,e If first nameserver not able to resolve the url into IP, the next nameserver in the list will try. So, you should mention the most reliable nameserver at top.

Below, is my system nameserver before loging in to juniper VPN and after login to it

arun@arun-yadav:~/Projects/third-pillar$ nslookup localhost # not logedin to VPN, so my DNS is at my localhost port 53 i,e

Non-authoritative answer:
Name:    localhost

arun@arun-yadav:~/Projects/third-pillar$ nslookup localhost # loged in to VPN and so DNS get changed

Non-authoritative answer:
Name:    localhost

Now above we have seen that, when we start juniper it introduce a nameserver in resolv.conf file and when we logout of it, the entry also get removed. But, last night I switched off the system without loging out of juniper, so the entry get remained there. Now, in morning, when I start to access any web page, it is trying to use DNS of juniper, which will obviously not work as Iam not connected to it, Nor I can connect as juniper url will itself not get resolved. It resulted in deadlock which get removed only by deleting the etc/resolv.conf file and recreating it.

Anyway….Thank God it get sorted out 🙂


tomcat on ubuntu : install configure start stop

Tomcat is application server .  more detail on it is available here. In simple words, tomcat is container for memory resident java program called servlets. Since, servlets are memory-resident, they can quickly respond to requests, as they do not incur the overhead of process creation and subsequent cleanup, unlike CGI-based scripting, e.g. perl, etc.

Although, there is no context of JSP in this post, I just want to mention it here as servlets and jsp is at the core of java and if you have to do any thing with java you must know servlets and JSP. So,  JSP is comparable to other technologies such as PHP and ASP, which combine programming/scripting with a markup language like HTML. The key difference being the programming language of choice. For example, PHP uses a C/C++/Java hybrid, ASP uses VBScript, and JSP utilizes the full power of the Java programming language.

With, the above introduction we will now install and configure tomcat. I have referenced myself from ubuntu help center here.

STEP 1 -> Prerequisite :

NOTE : I’ am using ubuntu 12.04 and current tomcat version available with it is tomcat7 if you get any higher version say 8 then replace all 7 with the current version i,e say 8

$ which java # check that java is installed if not install it. I will write a post on it some other day.

/usr/bin/java # so our java is present at the given location, if you do not find any you need to install java before proceeding further.

NOTE : the /usr/bin/java is symlinked file i,e it just contain information about the location of jvm. You must know the location of your jvm. Depending on how you have installed java, it may be present at different location. In my case it is present at /usr/lib/jvm. Further, you may have multiple java installed within your jvm folder, you just need to specify one of them in your tomcat configuration. If you find it difficult to locate your jvm folder, you can try below in terminal.

Locating installed java on ubuntu

$ which java
/usr/bin/java # so you java is installed and present in /usr/bin/java
$ cd /usr/bin/ # let us move to /usr/bin
$ ls -l | grep java # list the file with name java
lrwxrwxrwx 1 root   root          22 Oct 16 14:20 java -> /etc/alternatives/java
lrwxrwxrwx 1 root   root          23 Oct 16 14:21 javac -> /etc/alternatives/javac
lrwxrwxrwx 1 root   root          25 Oct 16 14:21 javadoc -> /etc/alternatives/javadoc
lrwxrwxrwx 1 root   root          32 Oct 16 14:21 javafxpackager -> /etc/alternatives/javafxpackager
lrwxrwxrwx 1 root   root          23 Oct 16 14:21 javah -> /etc/alternatives/javah
lrwxrwxrwx 1 root   root          23 Oct 16 14:21 javap -> /etc/alternatives/javap
lrwxrwxrwx 1 root   root          25 Oct 16 14:20 java_vm -> /etc/alternatives/java_vm
lrwxrwxrwx 1 root   root          24 Oct 16 14:20 javaws -> /etc/alternatives/javaws

NOTE : the files are again symlinked file pointing to /etc/alternatives i,e we need to find 
our jvm there
$ cd /etc/alternatives/ #moving to /etc/alternatives

$ ls -l | grep java # listing java file within it
.......many more lines 
lrwxrwxrwx 1 root root  34 Oct 16 14:21 jar -> /usr/lib/jvm/java-7-oracle/bin/jar
lrwxrwxrwx 1 root root  39 Oct 16 14:20 java -> /usr/lib/jvm/java-7-oracle/jre/bin/java

NOTE : the files are again symlinked file pointing to /usr/lib/jvm/java-7-oracle. Now if you go 
to /usr/lib/jvm, you can find different installed java, in my case, I am having only java-7-oracle. 
So my JVM_HOME will be /usr/lib/jvm/java-7-oracle

$ sudo apt-get install libtomcat7-java # it install java related dependency of tomcat7

$ sudo apt-get install tomcat7-common  # it will install some other common dependency of tomcat

STEP 2 ->Installing Tomcat :

$ sudo apt-get install tomcat7 # the last few lines are, check them as it will tell you about any 
faults or other things you need to do

Unpacking tomcat7 (from .../tomcat7_7.0.26-1ubuntu1.1_all.deb) ...
Selecting previously unselected package authbind.
Unpacking authbind (from .../authbind_1.2.0build3_i386.deb) ...
Processing triggers for ureadahead ...
ureadahead will be reprofiled on next reboot
Processing triggers for man-db ...
Setting up libcommons-collections3-java (3.2.1-5) ...
Setting up libcommons-pool-java (1.5.6-1) ...
Setting up libcommons-dbcp-java (1.4-1ubuntu1) ...
Setting up libecj-java (3.5.1-3) ...
Setting up libservlet3.0-java (7.0.26-1ubuntu1.1) ...
Setting up libtomcat7-java (7.0.26-1ubuntu1.1) ...
Setting up tomcat7-common (7.0.26-1ubuntu1.1) ...
Setting up tomcat7 (7.0.26-1ubuntu1.1) ...

Creating config file /etc/default/tomcat7 with new version
Adding system user `tomcat7' (UID 120) ...
Adding new user `tomcat7' (UID 120) with group `tomcat7' ...
Not creating home directory `/usr/share/tomcat7'.
* no JDK found - please set JAVA_HOME
invoke-rc.d: initscript tomcat7, action "start" failed.
Setting up authbind (1.2.0build3) ...

Since the log tell us to set java home, we will set it

NOTE : In ubuntu anything you install through sudo apt-get command install it to /etc folder , so you can find a tomcat7 folder here. If you install anything through download package it will get installed to /usr/local folder

$ sudo su – # you need to be root user to edit /etc/default/tomcat7 file

$ nano /etc/default/tomcat7 # to use nano editor see here. You can use any other editor also to edit this file, but at end you should be able to add java_home to it


~# exit # exist as the root user

STEP 3 -> Starting tomcat

If you install any thing with sudo apt-get install the start file resides in /etc/init.d folder

$ sudo /etc/init.d/tomcat7 start #the other options are  stop restart try-restart force-reload and status

STEP 4 -> See it running in the browser

http://localhost:8080 # on browser will load the page with message its working.

If the port 8080 is allready in use by some other server, you can change it by changing below line in /etc/tomcat6/server.xml

<Connector port="8080" protocol="HTTP/1.1"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Step 5 -> Installing standard webapps

Tomcat is shipped with webapps that you can install for documentation, administration or demo purposes.

$ sudo apt-get install tomcat7-docs # it will install the documentation for your reference

http://localhost:8080/docs/ # you can see the complete reference in your local browser onward

Step 6 -> Installing tomcat admin # will provide you a interface to administer tomact i,e start stop this

$ sudo apt-get install tomcat7-admin

Try to login to the admin page
http://localhost:8080/manager/html # it will ask you for username password  Access to the host-manager application is also protected by default:  you need to define a user with the role “admin” in  /etc/tomcat6/tomcat-users.xml  before you can access it.

add below line to this file

<role rolename="manager-gui" />
<user username="arun" password="happyarun" roles="manager-gui" />

restart the server

# sudo /etc/init.d/tomcat7 restart

reload the page and enter username and  password can see the admin page

For security reasons, the tomcat7 user cannot write to the /etc/tomcat7 directory by default. Some features in these admin webapps (application deployment, virtual host creation) need write access to that directory. If you want to use these features execute the following, to give users in the tomcat7 group the necessary rights:

$ sudo chgrp -R tomcat7 /etc/tomcat7
$ sudo chmod -R g+w /etc/tomcat7

STEP 7 -> Installing tomcat example package

The tomcat7-examples package contains two webapps that can be used to test or demonstrate Servlets and JSP features, which you can access them by default at http://yourserver:8080/examples. You can install them by entering the following command in the terminal prompt:

$ sudo apt-get install tomcat7-examples # after completion see the example app in browser as below

http://localhost:8080/examples/ # will show you the example web app


linux command with examples

I am using Ubuntu for last 5 years and doing a lot of things from command line. Many of the day to day command is now on my tip, but many of more I have used is out of my mind, and I have to google it back, So I have decided to note it down here for my future reference. I will keep adding to it whenever I get time or use new command.

Note : 

Linux command can take a no of options. These options can be passed in both shorthand form or expanded form. with shorthand form use single hyphen – and with expanded form use double hyphen –  -, say you can get help option to a command as -h or – -h

Some options do not need any argument while other need some argument to be passed with them. you can pass all the options separately, but it is better to pass argument less options grouped together and passing option with argument separately. Say,  $ mkdir -pv -m 777 myfolder is more concise then $ mkdir -p -v -m 777 myfolder. In the first case we have grouped -p -v together as -pv. Since -m option need further argument here we have passes 777, we have kept it separate from -pv

| , known as pipe is very important for filtering result when used with grep. | basically, pass the result of first function as a block to the next function. Example,  ls | grep myfile will list only those files and folder which have myfile in there name. Here ls will return list of all file and folders which will passed to grep, which will do the filtering.

1 -> history # will show you all the command you have typed in past

Syntax : history #it do not take any argument


$ history # will list all comand used in past

$ history | grep netbeans # since we have piped the result of history to grep it will return only those command , which contain word history in them

2 -> man #show complete detail of a command

syntax : man command_name

It is basically short form of manual and will tell you detail about other commands you pass to it as argument. It will explain you what that particular command do, how it work, what options it will take and so on. Basically, if you remember name of any command, you can get all detail of it with man command.


$ man man # it will tell about how to use man itself

$ man sudo # will tell you all about sudo command

$ man dpkg # will tell you all about dpkg command

3 -> help #show tha available options for a command

Syntax: command_name – -help or command_name -h

unlike man , it will just tell you about different options a command can take. Since, most of the time we are most concerned about the available options a command can take rather then the whole detail, It is used more often then the man command. Also, most of the software , say netbeans comes with help option which will help you on how to execute them. On other hand man will work only with ubuntu command.

NOTE : If you know name of a command, you can get all available options with -h or – -help option. Remember that for some command -h not work but you have to pass – -help. for example:  rm -h will not work, you have to use rm – -help to know about rm options


$ cd /netbeans-6.9.1/bin #move to netbeans bin directory

$ ./netbeans – -help # you want to start netbeans and want to know available options. It has listed down all options for you
General options:
  –help                          show this help
  –jdkhome <path>      path to Java(TM) 2 SDK, Standard Edition
  -J<jvm_option>        pass <jvm_option> to JVM

  –cp:p <classpath>    prepend <classpath> to classpath
  –cp:a <classpath>    append <classpath> to classpath

4  -> ls # Listing files and folders

Syntax : ls [options] #options are optional, if you do not pass it will take the default, you can see complete list of options

with ls – -help


$ ls #will list all folder and files but not hidden files or folder

$ ls -a # will list hidden files and folders also

$ ls -B #will not list the backup file ending with ~

$ ls -l # will do complete listing with all details like owner, date, permission etc. but will not show hidden file

$ ls -l -a -B #will do all the above

5 -> mkdir # creating directory

Syntax: mkdir [options] directory_name #options are optional, if you do not pass it will take the default, you can see list of options with mkdir – -help


$ mkdir myfolder

$ mkdir -p myfolder1/myfolder2/myfolder3 # -p option tell to create nested directory with parent child relation. Thus myfolder3 will be created in myfolder2 and so on

$ mkdir -p myfolder# the p option means parent , if the directory already exist do not throw error but use the existing directory as parent

$ mkdir -pv -m 777 myfolder # it will not complain if directory exist, set the permission to 777 and also print the task it performing on terminal

6 -> cd #changing directory

Syntax : cd directory_name # you can pass directory_name or .. or ~ to cd


$ cd myfolder # take you inside myfolder

$ cd .. # take you out from current folder to the previous folder

$ cd ~ # take you out of every previous folder to the root of terminal

7-> touch # it will create a file if not present and if already present will modify its modification or access time depending on argument you pass to it, but not overwrite its content

Syntax : touch [options] file_name # touch –help will show you all available option. If you do not pass any option you can create multiple file with single touch command

Examples :

$ touch test1 #will create test1 file

$ touch test1 test2 test3 test4 # will create test2 test3 test4 as new file. Since test1 is already there it will just modify its access time

$ touch -a test1 # will change access time of test1 file

$ touch -m test1 # will change modification time of file test1

$ touch -am test1 # will change both access as well as the modification time

$ touch -d '1 May 2005 10:22' test1 # with d option you can set any date you want but maintain the formate of string, say '1 05 2005 10:22' otherwise '2005 1 May 10:22' will give error. however, you can ignore time if you want

$ touch -d '1 May 2005' test1 # it will set only the date, if you do not pass year then it will take current year i,e '1 May' will also work

$ touch -r test2 test1 # -r is reference option i,e it will set datetime of file test2 to test1 file

8 -> rm # removing file or folder, by default it remove only files to remove a folder, you need to pass additional options

Syntax: rm [options] file_or_directory_name #options are optional, if you do not pass it will take the default, you can see list of options with rm – -help

Example :

$ rm my_file # will remove my_file

$ rm -f my_file # will not throw error if my_file do not exist i,e it will ignore the removal

$ rm -fi my_file # Will ignore if file is not there and ask you to press Y to delete the file i,e it will become interactive

$ rm -r my_folder # The -r option must be passed to delete a folder other while it will not delete it

$ rm -rf my_folder # will delete the folder and will not complain if the folder do not exist

9 -> rmdir #it will list empty directory

Syntax : rmdir [options] directory_name # without argument it will delete all empty directory name passed to it. It will throw error if directory is not empty. for that case use rm as above


$ rmdir dir1 dir2 dir3 # it will delete the empty directory dir1 dir2 dir3

$ rmdir -p dir1/dir2/dir3/dir4 # It will delete the parent also if deleting the child make it empty, so first dir4 will be deleted then dir3 then dir2 and so on

10 -> mv # It will move file or directory to other location. if the location of source destination is same the file or directory will be get renamed

Syntax: mv [options] source destination # If two files are provided as source and destination source will be renamed as destination. If you pass more then two argument and the last one is directory all the previous will be treated as source and will be moved into the last directory, but if the last argument is not directory it will throw error.

Examples :

$ mv myfile.txt myfile.rb # it will rename myfile.txt to myfile.rb i,e the name is changed.

$ mv -bvi myfile.txt myfile.rb # here we are passing some option b will backup the file before renaming, i will ask your yes no before renaming and v will print what going on the console

$ mv test1 test_folder myfile.rb /home/arun/my_folder # it will move the file test , myfile.rb and the test_folder to /home/arun/my_folder

$ mv *  /home/arun/my_folder # it will move everything in current folder to /home/arun/my_folder

11-> grep # It is used to search a pattern specified by user in the given text or files or block passed from first command to it through the pipe symbol |

Syntax: grep [options] pattern [files] # the complete list of options can be accessed with grep – -help command. If you want to match more than one word pass  within ” “

$ grep “Linux is good” file1 file2 file3 # It will list all lines of these three file containing “Linux is good” in it in separate line, each line will be preceded with name of the file in which they appear. If you do not want the file name you can use -h option as below

$ grep -h “Linux is good” file1 file2 file3 # It will not precede the matched line with the file in which they are found

$ grep -i “Linux is good” file1 file2 file3 # it tell to ignore the case i,e “linux is good” will also match

$ grep “Linux is good” * #will search the text “Linux is good” in all the text file in the current directory

$ grep -r “Linux is good” * #-r option will make it to search the text “Linux is good” in all the text file recursively in the current directory as well as all it child directory

$ grep -c “Linux is good” file1 file2 # It will not print each line but just return the count of match in each file

$ grep -n “Linux is good” file1 file2 # It will also print the line number of the line containing the pattern in each file

$ grep -rni “Linux is good” * # will recursively search each directory, print the line no and will ignore the case

$ ls -l | grep “foo” # it will list only those file and directory which containn the word foo

$ history | grep rails # will list history of only those command which contain the word rails

$ history | grep -in rails #will ignore case,  and print line no.

12 -> less # can be used to see content of a file .It allow you to display a large data in block and let you to scroll down, basically, it keep the screen at first line and let you scroll down. If you do not use this, screen will set to the last line and you have to scroll up to see the first line. you can exit the content by pressing q .

Syntax : less [options] file_name # you can see complete list of option with less – -help. Though, generally, I used it to see the content of file or a command from top and have not tried any options .


$ less myfile.txt # It will show content of file from the top, need to scroll down to see more content. press q to exit the content

$ ps -ef | less #will show the result of ps -ef command from the top

13 -> more # It can be also used to display content of a file on terminal.

syntax: more [options] file_name # By default It do not provide scroll down facility like less to see the whole content but show only that much content which fit into your screen. however, using different options you can set the no of line you want to see, which will activate the scrolling if the set line not come on the screen


$ more myfile # will show that much content of file which fit in screen

$ more -100 + 50 myfile # will show 100 lines of file starting from line 50

$ more +/”Iam arun” -100 # will show 100 line of the file from the line which contain “Iam arun”

$ more -s -u -100  +50 myfile #  s will cause to remove blank line from display and u will remove underlines

$ ps -ef | more -10 + 20 # will display 10 lines of the result of command ps -ef starting from the 20 line

14 -> cat # will be used to create a file, read a file, concenate content of many files

syntax : cat [options] [input_filename] [> or >>] [output_filename] # all the things in [] is optional i,e cat can work without them also


1 -> If you do not provide output_filename the output will be printed on terminal itself i,e terminal is the standard output for cat command

2 -> > and >> both are called append operator i,e write content to a file but > will erase the file of content if exist and write to it but >> will add the new content to the existing content , so it is safer to use >> instead of>


$ cat >> test_file1 # it will create test_file1 and when you press enter it will take you to the next line where you write to it, to exist press enter then press ctrl and d
I have pressed enter on last line to reach here
again pressed eneter to come to next line and keep writing
All content Iam writing will get written to test_files1                                 
to exist writing we will press Enter followed by Ctrl D

$ cat test_file1 # it will show you content of file test_file1, so you can see the content you have written on the terminal
I have pressed enter on last line to reach here
again pressed eneter to come to next line and keep writing
All content Iam writing will get written to test_files1
to exist writing we will press Enter followed by Ctrl D

arun@arun-yadav:~$ cat -n test_file1 #the -n option will print the line no also
  1    I have pressed enter on last line to reach here
     2    again pressed eneter to come to next line and keep writing
     3    All content Iam writing will get written to test_files1
     4    to exist writing we will press Enter followed by Ctrl D

$ cat >> test_file2 # will create a new file
This is the second file # you added this line to test_file2

$ cat test_file1 test_file2 >> test_file3 # will create file test_file3 and append content of test_file1 test_file2 to it

$ cat test_file3 # it show the content of test_file3, you can see that this file contain content of both the files
I have pressed enter on last line to reach here
again pressed eneter to come to next line and keep writing
All content Iam writing will get written to test_files1
to exist writing we will press Enter followed by Ctrl D
This is the second file

15 -> echo # you can use it to write a string to file or terminal itself

syntax: echo string [filename] # file name is optional if you do not pass it the output will be printed to the terminal

unlike cat, it can use to write single string to a file or terminal i,e you can write multiple lines as with cat command


$ echo Iam Arun # it will print the output to terminal
Iam Arun
$ echo Iam Arun to test_file >> test_file # it will append the string to the test_file, if test_file is not present >> operator will create it and the append to it
$ cat test_file # we will see the content of test_file
Iam Arun to test_file
$ echo Iam adding one more line >> test_file # one more line is appended
$ cat test_file # you can see both the line
Iam Arun to test_file
Iam adding one more line
$ echo this “>” operator is dangerous as it will erase and write > test_file # see the danger of using >, if the file exist it will erase its content before appending
arun@arun-yadav:~$ cat test_file
this > operator is dangerous as it will erase and write # see earlier line is erased and only single line present

16 -> pstree # will return all the running process in tree structure with there name and process id

Syntax : pstree [options] [pid or username] # you can see the  complete list of option with  pstree – -help. the argument is user or process_id whose tree you want to see


$ pstree #will list all the running process with all the user

$ pstree root # will show all the process running with root user

$ pstree arun # will list all the process running with the user arun

$ pstree -p arun # will print the PID i,e process id also with the name

$ pstree -pn  # will print the PID and also in the sorted order

$ pstree -pnh # the h option will highlight the current running process

$ pstree -pnhu # the u option will also print the user owning that process

$ pstree -pnhul # l option will not allow to truncate the process detail if it is too long

17 -> pgrep # It will return PID of the process

Syntax : pgrep process_name # it will return the PID of process_name. It will be helpful if you know the process name otherwise use pstree or ps to find PID


$ pgrep firefox # will return PID of firefox

$ pgrep ruby # will return PID of ruby

$ pgrep skype # will return PID of skype

18 -> ps # it means process status and return all the running process with name and PID

Syntax :  ps [options] # you can see all the available options with ps – -help

Examples :

$ ps # will return currently active process

$ ps -e # will return all the running process

$ ps -ef # will return all running process with full detail

$ ps -ef | less # as process list is very long, we have piped the output of ps -ef to less command. It help you to display result in small blocks and let you to scroll down to see more.

NOTE : IF you want to kill some process through script, you will jut need the PID to pass it to kill command. say to kill apache 2 from script you can use below:

kill -9 $(ps -e | grep apache2 | awk '{print $1}')

19 -> pkill # will kill the process passed to it

Syntax: pkill process_name # It would be helpful only if you know the name of process, you want to kill


$ pkill ruby

$ pkill firefox

20 -> kill # will kill the process whose PID is passed to it

syntax : kill [signals] PID # there is 60 type of signal which can be passed to kill, but you have to just remember 9 which is called SIGKILL, the default signal passed is 15 which is called SIGTERM. Actually, kill do not kill the process itself instead, it just pass proper signal to a process which cause it to terminate i,e logic of termination is in every process itself. Say, for example when you close firefox browser, signal 9 get passed to the firefox process by our OS and it get terminated. The kill command just give you a way to pass signal to a process from the terminal.Thus by passing proper signal with kill you can control any state of a process. But mostly that is not needed. Mostly it is use to close any hanged process. If any process get hanged, you get its PID from the above pstree or pgrep or ps command and the pass it to kill to terminate that hanged process.

NOTE: the complete list of signal available for kill can be listed with kill -l


$ kill 485 #will terminate the process with PID 485. here the default signa 15 get passed, there may be chance that it fail to kill the process, say if it is making some system call

$ kill -9 485 # it will be guaranteed that the process will be called. If the process is making any system call, it will wait and kill it when it return from the call

21 -> killall #will kill the process along with its child whose name passed to it. helpful if you know the process name

syntax: killall [options] process_name #will kill the process and all its child

NOTE: Killing by file name only works for executables  (i.e., runnable programs) that are kept open during execution


$ killall nautilus #will kill the nautilus process

$ killall -e nautilus # it will tell to kill whose name exactly match with nautilus. It will be helpful if your process name is more that 15 character, since killall by default match only upto that, so will delete all other process also whose first 15 character matches. the -e option will prevent this.

$ killall -ew nautilus # the w option will tell to wait till all the process are killed, otherwise killall check it every second by default and resend the signal if found some is still running, but since some has already get  killed, some signal become unresponsive. Also killall can kill all the process, including other killall process, except itself

22 -> pwd # will print the current working directory

23 -> clear # It will remove all previous command and output from the console

24->SCP # You can take it as server copy. scp command is used to copy files from one server to other.It can be from your local machine to some  other machine or vice versa. You can also use it to copy file between two different machine from your system.

Below will be the syntex :

CASE 1: Copy file from from your system to some other system:
scp  /path/to/local/file  username@hostname:/path/to/remote/file

CASE 2: Copy file from another system to your system:

scp  username@hostname:/path/to/remote/file  /path/to/local/file

CASE 3: Copy file from some system to some other system from your machine:

scp  username1@hostname1:/path/to/file  username2@hostname2:/path/to/other/file

NOTE : to copy a directory instead of file in any of the above case use scp -r instead of just scp

NOTE : username@hostname is basically the url to which you ssh

24-> lscpu

This will tell you information about your CPU. Like you may want to know, you are having 32 bit or 64 bit processor (remember many a time at the time of download you do not know you should download 32 or 64 bit version).

Example :

$ lscpu
Architecture:                          i686
CPU op-mode(s):                   32-bit, 64-bit
Byte Order:                           Little Endian
CPU(s):                                   4
On-line CPU(s) list:              0-3
Thread(s) per core:              2
Core(s) per socket:               2
Socket(s):                              1
Vendor ID:                          GenuineIntel
CPU family:                         6
Model:                                 42
Stepping:                             7
CPU MHz:                           3092.905
BogoMIPS:                         6185.90
Virtualization:                     VT-x
L1d cache:                           32K
L1i cache:                            32K
L2 cache:                             256K
L3 cache:                             3072K

Architecture showing to be i686(X86, i686, or i386 is same), which means your OS is of 32 bit. But the CPU op-mode showing that it can work in both 32 and 62 bit mod i,e your CPU is of 64 bit. So if you want you can install 64 bit Ubuntu OS on it, but if the mode is only 32 bit, you can’t


X86, i686, or i386      means you are running a 32 bit kernel i,e OS.
X86_64 , amd64 , or X64 means you are running a 64 bit kernel i,e OS.

24 -> netstat

It display information about all the running internet connection be default. if you pass -a option it will display inactive connection also. It take a number of options. You can find all the available option with below command:

        # netstat -h

        -r, –route              display routing table
        -i, –interfaces         display interface table
        -g, –groups             display multicast group memberships
        -s, –statistics         display networking statistics (like SNMP)
        -M, –masquerade         display masqueraded connections

        -v, –verbose            be verbose
        -W, –wide               don’t truncate IP addresses
        -n, –numeric            don’t resolve names
        -N, –symbolic           resolve hardware names
        -e, –extend             display other/more information
        -p, –programs           display PID/Program name for sockets
        -c, –continuous         continuous listing

        -l, –listening          display listening server sockets
        -a, –all, –listening   display all sockets (default: connected)
        -o, –timers             display timers
        -F, –fib                display Forwarding Information Base (default)
        -C, –cache              display routing cache instead of FIB

You can use any of the above options


root@arun-desktop:~# netstat -ltnp
Active Internet connections (only servers)
Proto     Recv-Q     Send-Q         Local Address           Foreign Address     State       PID/Program name
tcp        0                        0   *               LISTEN      2322/cupsd      
tcp        0                        0   *               LISTEN      3176/skype      
tcp        0                        0     *                  LISTEN      1135/vmware-authdla
tcp        0                        0    *               LISTEN      1460/dnsmasq    
tcp6       0                       0            ::1:631                         :::*                    LISTEN      2322/cupsd      
tcp6       0                       0            :::443                            :::*                    LISTEN      10916/apache2   
tcp6       0                       0            :::8140                          :::*                    LISTEN      10916/apache2   
tcp6       0                       0            :::80                               :::*                    LISTEN      10916/apache2


25-> browsing folder as root user.

sometime you want to open folder as root user, so that you can directly browse and edit a file. For example, say you want to edit standalone.xml file of jboss . If you go to that file through the UI, open it and edit it, you can’t as you have browsed it as normal user so don’t have permission to edit it. So in such case you can browse the file as root user with below command.

root@arun-desktop:~# nautilus

arun@arun-desktop:~$ sudo nautilus # for non root user

26->Complete Listing

Complete list of Linux command with detailed explanation is available here.

Reference :

Leave a comment

sh command in linux ubuntu

While, trying out rails deployment with Capistrano, I have seen use of sh multiple time in the Capistrano terminal log. To get some detail on it, I searched on Google and find very good documentation here. Technically, sh command executes the Bourne shell, likely taking you to a $ prompt.The simplest definition I will give is that “sh command execute terminal command from any file with .sh extension”

=> Example:

Create a file with .sh extension, say

Add below lines to the file

#!/bin/sh # this is the default location, so you can ignore it, but mention it if your sh script is located at some other place. As a good practice always mention it

mkdir my_folder #it will create my_folder directory
cd my_folder # will take you to my_folder directory
mkdir my_notes #again make a directory my_notes within my_folder directory
cd my_notes #take you to my_notes folder
touch first_note.txt #create a first_notes.txt file within my notes directory
echo “see your sh example is working” >> first_note.txt # add a line to the first_notes file
cat first_note.txt #print the content of first_notes.txt on the terminal

Now go terminal and run the below command

arun@arun-yadav:~$ sh
see your sh example is working # this is the result of last command in our file

Now, if you check your folders, you will see all the newly created content

=> Running a .sh file

.sh file is nothing but the shell script to install given application or to perform other tasks under UNIX like operating systems. When we download any software, we find file which basically conten a set of command to be exicuted on the terminal. We can run any .sh file in following way

-> $ sh

-> $ bash # sh is also a bash script, so this will also work

-> $ ./ #this will work if the have executable permission, you can grant it with chmod +x command, if not already there.more detail on managing file permission is available here

-> $ sudo bash # above will not work if, the file need to be executed by root user, in that case use this command, alternatively you can login as root user with su – command and use any of the above method

=> sh options

You can, provide a no of options to sh to suit your need. The complete list is available here. A sh command with all the options will look something like this

sh [-a] [-c] [-C] [-e] [-E] [-f] [-h] [-i] [-I][-k] [-m] [-n] [-p] [-r] [-s] [-t] [-T] [-u] [-v] [-x] [ argument ]

Explanation of some most commonly used options is  is as below:

-c string #If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.


$ sh -c “mkdir my_folder && cd my_folder && touch my_notes.txt”

-C    #Don’t overwrite existing files with “>.”

-i # If the -i option is present, the shell is interactive.

-I # Make bash act as if it had been invoked as a login shel

-s #If the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.

[argument] # this is basically a string of command when you are using -c option or the value you pass, interactively by using -s option. If arguments remain after option processing, and neither the -c nor the -s option has been supplied, the first argument is assumed to be the name of a file containing shell commands. If bash is invoked in this fashion, $0 is set to the name of the file, and the positional parameters are set to the remaining arguments. Bash reads and executes commands from this file, then exits. Bash’s exit status is the exit status of the last command executed in the script. If no commands are executed, the exit status is 0. An attempt is first made to open the file in the current directory, and, if no file is found, then the shell searches the directories in PATH for the script.