我們使用ssh連接服務器之后,如果在執行某個命令需要時間特別長,當把終端斷掉之后,命令就自動停止了一般我們在ssh客戶端執行命令之后,默認他的父進程是ssh,所以把ssh終端關掉之后,子進程也就被自動kill掉了,解決辦法就是更改這個命令進程的父進程為init,那樣ssh退出去之后,命令依然會運行
默認情況下:
[root@localhost ~]# ping 127.0.0.1 &>/dev/null & [1] 1782 [root@localhost ~]# pstree init─┬─VBoxService───7*[{VBoxService}] ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─dbus-daemon ├─dhclient ├─hald───hald-runner─┬─hald-addon-acpi │ └─hald-addon-inpu ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─redis-server───2*[{redis-server}] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash─┬─ping -------->從進程樹中可以看出ping的父進程是ssh │ └─pstree └─udevd───udevd
解決辦法:
1.使用nohup 即 nohup commond & [root@localhost ~]# nohup ping 127.0.0.1 &>/dev/null & 查看進程: [root@localhost ~]# pstree init─┬─VBoxService───7*[{VBoxService}] ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─dbus-daemon ├─dhclient ├─hald───hald-runner─┬─hald-addon-acpi │ └─hald-addon-inpu ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─ping ---------->ping的父進程已經是init了 ├─redis-server───2*[{redis-server}] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───pstree └─udevd───udevd 2.使用setsid setsid commond & [root@localhost ~]# setsid ping 127.0.0.1 &>/dev/null & 查看進程; [root@localhost ~]# pstree init─┬─VBoxService───7*[{VBoxService}] ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─dbus-daemon ├─dhclient ├─hald───hald-runner─┬─hald-addon-acpi │ └─hald-addon-inpu ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─ping ---------->ping的父進程已經是init了 ├─redis-server───2*[{redis-server}] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───pstree └─udevd───udevd 3.使用(), (commond &) [root@localhost ~]# ( ping 127.0.0.1 &>/dev/null & ) 查看進程樹: [root@localhost ~]# pstree init─┬─VBoxService───7*[{VBoxService}] ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─dbus-daemon ├─dhclient ├─hald───hald-runner─┬─hald-addon-acpi │ └─hald-addon-inpu ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─ping ---------->ping的父進程已經是init了 ├─redis-server───2*[{redis-server}] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───pstree └─udevd───udevd