How to remotely log on to the background using the Linux Command Line

Source: Internet
Author: User

Http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/()

 

We often encounter this problem. We use Telnet/ssh to log on to a remote Linux server and run some time-consuming tasks. As a result, the task fails midway through due to network instability. After the command is submitted, how does one prevent the local terminal window/network disconnection? Here are some examples. You can select different methods for different scenarios to solve this problem.

Nohup/setsid /&

Scenario:

If a temporary command needs to be run for a long time, what method can be used to ensure its stable operation in the background?

In earlier versions of UNIX, hangup names communicate with the system through modem. When a user logs out, the modem hangs up. Similarly, when the modem is disconnected, it will send an hangup signal to the terminal to notify it to close all sub-processes.

Solution:

We know that when a user logs out or the network is disconnected, the supervisor will receive an HUP signal to close all its sub-processes. Therefore, our solution has two ways: either let the process ignore the HUP signal, or let the process run in a new session to become a child process that does not belong to this terminal.

1. nohup

Nohup is undoubtedly the first method we have come up. As the name suggests, nohup is used to make the submitted command ignore The hangup signal. Let's take a look at the help information of nohup:

NOHUP(1)                        User Commands                        NOHUP(1)NAME       nohup - run a command immune to hangups, with output to a non-ttySYNOPSIS       nohup COMMAND [ARG]...       nohup OPTIONDESCRIPTION       Run COMMAND, ignoring hangup signals.       --help display this help and exit       --version              output version information and exit 

It can be seen that nohup is very convenient to use. You only need to add nohup before the command to be processed. The standard output and standard error will be redirected to the nohup. Out file by default. Generally, we can add"&"To run commands in the background at the same time.">filename 2>&1"To change the default redirection file name.

Nohup example

                [root@pvcent107 ~]# nohup ping www.ibm.com &[1] 3059nohup: appending output to `nohup.out'[root@pvcent107 ~]# ps -ef |grep 3059root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.comroot      3067   984  0 21:06 pts/3    00:00:00 grep 3059[root@pvcent107 ~]# 

2. Setsid

Nohup can undoubtedly avoid interruption of our process by ignoring the HUP signal. However, if we think from another perspective that our process is not a sub-process of the terminal that accepts the HUP signal, then it will naturally not be affected by the HUP signal. Setsid can help us do this. Let's take a look at the help information of setsid:

SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)NAME       setsid - run a program in a new sessionSYNOPSIS       setsid program [ arg ... ]DESCRIPTION       setsid runs a program in a new session. 

It can be seen that the use of setsid is also very convenient, you only need to add setsid before the command to be processed.

Setsid example

                [root@pvcent107 ~]# setsid ping www.ibm.com[root@pvcent107 ~]# ps -ef |grep www.ibm.comroot     31094     1  0 07:28 ?        00:00:00 ping www.ibm.comroot     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com[root@pvcent107 ~]#   

In the preceding example, the process ID (PID) is 31094, and its parent ID (ppid) is 1 (that is, the INIT process ID ), it is not the process ID of the current terminal. Compare this example with the parent ID in the nohup example.

3. &

Here is also a tip about subshell. We know that the inclusion of one or more names in "()" allows these commands to run in the sub-shell, thus extending many interesting functions, we will discuss one of them now.

After we put "&" into "()", we will find that the submitted jobs are not in the job list, that is, they cannot passjobs. Let's take a look at why we can escape the influence of the HUP signal.

Subshell example

                [root@pvcent107 ~]# (ping www.ibm.com &)[root@pvcent107 ~]# ps -ef |grep www.ibm.comroot     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.comroot     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com[root@pvcent107 ~]#   

From the above example, we can see that the parent ID (ppid) of the newly submitted process is 1 (pid of the INIT process) and is not the process ID of the current terminal. Therefore, it does not belong to the sub-process of the current terminal, so it will not be affected by the HUP signal of the current terminal.

Back to Top

Disown

Scenario:

We already know that adding nohup or setsid before the command can avoid the influence of the HUP signal. But if we have submitted the command without any processing, how can we remedy it to avoid the impact of the HUP signal?

Solution:

It is too late to add nohup or setsid. You can only solve this problem through job scheduling and disown. Let's take a look at the help information of disown:

disown [-ar] [-h] [jobspec ...]Without options, each jobspec is  removed  from  the  table  ofactive  jobs.   If  the -h option is given, each jobspec is notremoved from the table, but is marked so  that  SIGHUP  is  notsent  to the job if the shell receives a SIGHUP.  If no jobspecis present, and neither the -a nor the -r option  is  supplied,the  current  job  is  used.  If no jobspec is supplied, the -aoption means to remove or mark all jobs; the -r option  withouta  jobspec  argument  restricts operation to running jobs.  Thereturn value is 0 unless a jobspec does  not  specify  a  validjob.

We can see that we can achieve our goal in the following ways.

Flexible Use of Ctrl-Z in our daily work, we can use ctrl-Z to suspend the current process to the background for pause, execute some other operations, then, use FG to re-run the suspended process back to the foreground (you can also use BG to put the suspended process in the background) to continue running. In this way, you can flexibly switch between multiple tasks in one terminal, which is particularly useful in code debugging. Because when the code editor is suspended to the background and then placed back, the cursor position remains at the position of the last suspension, avoiding the trouble of locating again.
  • Usedisown -h jobspec To enableA jobIgnore the HUP signal.
  • Usedisown -ah To enableAll jobsThe HUP signal is ignored.
  • Usedisown -rh To enableRunning jobIgnore the HUP signal.

It should be noted that after disown is used, the target job will be removed from the job list and we will no longer be able to usejobsTo view it, but still can useps -efFind it.

However, there is another problem. The operation object of this method is a job. If we add"&"To make it a job and run it in the background.jobsCommand to obtain the list of all jobs. But if the current command is not run as a job, how can I get its job number? The answer is to press Ctrl-z (hold down the ctrl key while holding down the z key!

CTRL-Z is used to suspend the current process (suspend), and then we can usejobsCommand to query its job number, and then usebg
jobspec
To put it in the background and continue running. Please use this method with caution if suspension affects the running result of the current process.

Disown Example 1 (if the command has been run in the background with "&", you can directly use "disown ")

                [root@pvcent107 build]# cp -r testLargeFile largeFile &[1] 4825[root@pvcent107 build]# jobs[1]+  Running                 cp -i -r testLargeFile largeFile &[root@pvcent107 build]# disown -h %1[root@pvcent107 build]# ps -ef |grep largeFileroot      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testLargeFile largeFileroot      4853   968  0 09:46 pts/4    00:00:00 grep largeFile[root@pvcent107 build]# logout   

Disown Example 2 (if you do not use "&" to run the command in the background when submitting the command, you can use ctrl-Z and "BG" to put it in the background, and then use "disown ")

                [root@pvcent107 build]# cp -r testLargeFile largeFile2[1]+  Stopped                 cp -i -r testLargeFile largeFile2[root@pvcent107 build]# bg %1[1]+ cp -i -r testLargeFile largeFile2 &[root@pvcent107 build]# jobs[1]+  Running                 cp -i -r testLargeFile largeFile2 &[root@pvcent107 build]# disown -h %1[root@pvcent107 build]# ps -ef |grep largeFile2root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testLargeFile largeFile2root      5824  5577  0 10:05 pts/3    00:00:00 grep largeFile2[root@pvcent107 build]#   

Back to Top

Screen

Scenario:

We already know how to protect the process from the HUP signal. But if a large number of such commands need to be run in a stable background, how can we avoid such operations on each command?

Solution:

The most convenient method is screen. Simply put, screen provides an ANSI/VT100 Terminal simulator to run multiple full-screen pseudo terminals under a real terminal. Screen has many parameters and has powerful functions. Here we will only introduce its common functions and briefly analyze why screen can avoid the impact of HUP signals. Let's take a look at the help information of screen:

SCREEN(1)                                                           SCREEN(1)NAME       screen - screen manager with VT100/ANSI terminal emulationSYNOPSIS       screen [ -options ] [ cmd [ args ] ]       screen -r [[pid.]tty[.host]]       screen -r sessionowner/[[pid.]tty[.host]]DESCRIPTION       Screen  is  a  full-screen  window manager that multiplexes a physical       terminal between several  processes  (typically  interactive  shells).       Each  virtual  terminal provides the functions of a DEC VT100 terminal       and, in addition, several control functions from the  ISO  6429  (ECMA       48,  ANSI  X3.64)  and ISO 2022 standards (e.g. insert/delete line and       support for multiple character sets).  There is a  scrollback  history       buffer  for  each virtual terminal and a copy-and-paste mechanism that       allows moving text regions between windows.

Screen is easy to use and has the following common options:

  • Usescreen -dmS session name To create a session in disconnected mode (and specify its session name ).
  • Usescreen -list To list all sessions.
  • Usescreen -r session name To reconnect to the specified session.
  • Use shortcutsCTRL-a d To temporarily disconnect the current session.

Screen example

                [root@pvcent107 ~]# screen -dmS Urumchi[root@pvcent107 ~]# screen -listThere is a screen on:        12842.Urumchi   (Detached)1 Socket in /tmp/screens/S-root.[root@pvcent107 ~]# screen -r Urumchi 

When we use "-R" to connect to the screen session, we can do whatever we want in this Pseudo Terminal, and no longer have to worry about the impact of the HUP signal on our processes, you do not need to add "nohup" or "setsid" to each command. Why? Let me take a look at the two examples below.

1. Process tree of the new process when screen is not used

                [root@pvcent107 ~]# ping www.google.com &[1] 9499[root@pvcent107 ~]# pstree -H 9499init─┬─Xvnc     ├─acpid     ├─atd     ├─2*[sendmail]     ├─sshd─┬─sshd───bash───pstree     │       └─sshd───bash───ping            

We can see that when screen is not used, bash is a sub-process of sshd. When SSH is disconnected, the HUP signal will naturally affect all sub-processes (including the newly created Ping process) under it ).

2. Process tree of the new process after screen is used

                [root@pvcent107 ~]# screen -r Urumchi[root@pvcent107 ~]# ping www.ibm.com &[1] 9488[root@pvcent107 ~]# pstree -H 9488init─┬─Xvnc     ├─acpid     ├─atd     ├─screen───bash───ping     ├─2*[sendmail]

When screen is used, bash is the sub-process of screen, while screen is the sub-process of Init (PID is 1. When SSH is disconnected, the HUP signal will not affect the sub-processes under the screen.

Back to Top

Summary

Now several methods have been introduced. We can select different solutions based on different scenarios. Nohup/setsid is undoubtedly the most convenient method for temporary needs. disown can help us to remedy jobs that are already running afterwards, screen is the best choice for batch operations.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.