How to prevent a background process from being stopped after closing SSH client in Linux

前端 未结 20 1311
悲&欢浪女
悲&欢浪女 2020-11-22 06:16

I\'m working on a Linux machine through SSH (Putty). I need to leave a process running during the night, so I thought I could do that by starting the process in background (

相关标签:
20条回答
  • 2020-11-22 07:09

    Nohup allows a client process to not be killed if a the parent process is killed, for argument when you logout. Even better still use:

    nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null
    

    Nohup makes the process you start immune to termination which your SSH session and its child processes are kill upon you logging out. The command i gave provides you with a way you can store the pid of the application in a pid file so that you can correcly kill it later and allows the process to run after you have logged out.

    0 讨论(0)
  • 2020-11-22 07:09

    If you're willing to run X applications as well - use xpra together with "screen".

    0 讨论(0)
  • 2020-11-22 07:10

    Check out the "nohup" program.

    0 讨论(0)
  • 2020-11-22 07:10

    As others have noted, to run a process in the background so that you can disconnect from your SSH session, you need to have the background process properly disassociate itself from its controlling terminal - which is the pseudo-tty that the SSH session uses.

    You can find information about daemonizing processes in books such as Stevens' "Advanced Network Program, Vol 1, 3rd Edn" or Rochkind's "Advanced Unix Programming".

    I recently (in the last couple of years) had to deal with a recalcitrant program that did not daemonize itself properly. I ended up dealing with that by creating a generic daemonizing program - similar to nohup but with more controls available.

    Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
      -V          print version and exit
      -a          output files in append mode (O_APPEND)
      -b          both output and error go to output file
      -c          create output files (O_CREAT)
      -d dir      change to given directory
      -e file     error file (standard error - /dev/null)
      -h          print help and exit
      -i file     input file (standard input - /dev/null)
      -k fd-list  keep file descriptors listed open
      -m umask    set umask (octal)
      -o file     output file (standard output - /dev/null)
      -s sig-list ignore signal numbers
      -t          truncate output files (O_TRUNC)
      -p          print daemon PID on original stdout
      -x          output files must be new (O_EXCL)
    

    The double-dash is optional on systems not using the GNU getopt() function; it is necessary (or you have to specify POSIXLY_CORRECT in the environment) on Linux etc. Since double-dash works everywhere, it is best to use it.

    You can still contact me (firstname dot lastname at gmail dot com) if you want the source for daemonize.

    However, the code is now (finally) available on GitHub in my SOQ (Stack Overflow Questions) repository as file daemonize-1.10.tgz in the packages sub-directory.

    0 讨论(0)
  • 2020-11-22 07:11

    Personally, I like the 'batch' command.

    $ batch
    > mycommand -x arg1 -y arg2 -z arg3
    > ^D
    

    This stuffs it in to the background, and then mails the results to you. It's a part of cron.

    0 讨论(0)
  • 2020-11-22 07:13

    Accepted answer suggest using nohup. I would rather suggest using pm2. Using pm2 over nohup has many advantages, like keeping the application alive, maintain log files for application and lot more other features. For more detail check this out.

    To install pm2 you need to download npm. For Debian based system

    sudo apt-get install npm
    

    and for Redhat

    sudo yum install npm
    

    Or you can follow these instruction. After installing npm use it to install pm2

    npm install pm2@latest -g
    

    Once its done you can start your application by

    $ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
    $ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)
    

    For process monitoring use following commands:

    $ pm2 list                      # List all processes started with PM2
    $ pm2 monit                     # Display memory and cpu usage of each app
    $ pm2 show [app-name]           # Show all informations about application
    

    Manage processes using either app name or process id or manage all processes together:

    $ pm2 stop     <app_name|id|'all'|json_conf>
    $ pm2 restart  <app_name|id|'all'|json_conf>
    $ pm2 delete   <app_name|id|'all'|json_conf>
    

    Log files can be found in

    $HOME/.pm2/logs #contain all applications logs
    

    Binary executable files can also be run using pm2. You have to made a change into the jason file. Change the "exec_interpreter" : "node", to "exec_interpreter" : "none". (see the attributes section).

    #include <stdio.h>
    #include <unistd.h>  //No standard C library
    int main(void)
    {
        printf("Hello World\n");
        sleep (100);
        printf("Hello World\n");
    
        return 0;
    }
    

    Compiling above code

    gcc -o hello hello.c  
    

    and run it with np2 in the background

    pm2 start ./hello
    
    0 讨论(0)
提交回复
热议问题