服务器后台运行程序

服务器后台运行程序,第1张

SSH 或者telent 远程登录到Linux 服务器,运行一些需要很长时间才能完成的任务。因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

nohup:不挂断的运行命令

&:放在后台运行

jobs:查看当前终端运行的后台进程

ps -ef:进程查看命令

Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

screen常见命令:

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。

ps:创建screen时,用S,不是s

pps:创建screen之前最好退出anaconda创建的虚拟环境,在base环境创建。不然会出现丢包和进错虚拟环境的问题。

有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了。那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢?有以下方法

1.让linux忽略终端的hung up 信号,不关闭进程;

2.让此进程变为终端的非子进程。

方法一:

在终端输入命令:

# ./pso >pso.file 2>&1 &

解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。

当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命

令:#cat pso.file )。

或者 在终端输入命令:

# nohup ./pso >pso.file 2>&1 &

解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前

目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file

文件就可看执行结果(命令:#cat pso.file )。

方法二:

实现方案就是nohup命令。

例如要启动jboss,可以nohup ./run.sh &。这样就可以了,结尾的“&”符号表示后台启动jboss,从而不影响继续运行其他命令。

但这样有一个问题,nohup命令虽然可以让linux“放过”这个进程,但是nohup会同时把进程的控制台输出重定向到nohup.txt下(默认是这个文件),当然可以重定向为其他的文件,但是输出总会有的。

如果jboss运行很长时间,而且如果有很多控制台输出的话,nohup.txt文件就会变的很大很大。

通常项目中的日志都会输出到特定的日志文件或者输出到 数据库 中,也就是说控制台的输出对于程序的意义不大,那么可不可以抛弃掉这些输出呢?答案是肯定的。

这里讲解一下linux的重定向(注意,是linux的重定向,不是针对nohup)。

0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。

在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。

另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。

结合nohup,我们可以这样 nohup ./run.sh >/dev/null &

这是最简单的一种方式,既保证了程序能够一直后台执行,又能保证不会产生太大的nohup.txt文件。

方法三:

利用的linux的一个机制,让程序在subshell中执行,方法很简单,将命令用括号() 括起来即可。

ps -ef | grep test

可以看到run.sh的父进程为1,不是当前终端了,这样就能忽略hung up信号。

当然linux还可以动态的让程序后台运行或不被hung up 信号关闭,例如disown命令,setid命令等。

方法四:

如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。当然你也可以使用超级键(Windows键)打开Dash,搜索“TERM”,然后点击“Term”图标来打开终端窗口。

对于其他的桌面环境来说,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或者面板上面包含终端图标。

通常情况下,你可以在终端里面直接输入应用程序名来启动一个应用程序。比如说,你可以通过输入“firefox”来启动Firefox。

在终端启动应用程序的好处是,你可以包含一些额外的参数。

例如,你可以通过下列命令来打开一个Firefox浏览窗口,然后利用默认的搜索引擎搜索相关信息:

firefox -search "linux.cn"

你可能会注意到,如果你启动Firefox,程序打开以后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。

通常情况下,如果你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关闭以后才会重新切换到终端控制。这是因为你在前台启动了这个程序。

如果要在Linux终端打开应用程序并且返回终端控制,那么你需要将应用程序启动为后台进程。

和下面所列的命令一样,我们可以通过增加一个(&)符号,将应用程序在后台启动。

libreoffice &

译者注:如果需要加参数的话,记得把&符号放在最后。

译者注:一般情况下,关闭终端时,在这个终端启动的后台程序也会被终止,要使终端关闭以后,后台程序依然保持执行可以使用下列命令

nohup command [arg...] &

如果应用程序目录没有安装在PATH变量包含的目录里面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。

/path/to/yourprogram &

如果你不确定程序输入哪个Linux目录结构的话,可以使用find或者location命令来定位它。

可以输入下列符号来找到一个文件:

find /path/to/start/from -name programname

例如,你可以输入下列命令来找到Firefox:

find / -name firefox

命令运行的结果会嗖的一下输出一大堆,别担心,你也可以通过less或者more来进行分页查看。

find / -name firefox | more find / -name firefox | less

当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,

你可以通过sudo命令来提示权限。当然,如果你没有安装sudo的话,就只能切换到一个拥有权限的用户了。

sudo find / -name firefox | more

如果你知道你要查找的文件在你的当前目录结构中,那么你可以使用点来代替斜杠:

sudo find . -name firefox | more

你可能需要sudo来提升权限,也可能根本就不需要,如果这个文件在你的主目录里面,那么就不需要使用sudo。

有些应用程序则必须要提升权限才能运行,否则你就会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或者使用sudo提升权限。

这里有个小窍门。如果你运行了一个程序,但是它需要提升权限来操作,输入下面命令试试:

sudo !!

方法五:

在Unix/Linux下如果想让程序独立终端运行,一般都是使用 &在命令结尾来让程序自动运行。(命令后可以不追加空格)

打开gnome-terminal,执行如下命令:

delectate@delectate:~$ totem &[1] 8510delectate@delectate:~$ 有几点需要注意:

已经启动的程序依然attach于当前pts,只有当前终端模拟器关闭(使用exit命令退出),进程自动被tty继承。delectate@delectate:~$ ps -e | grep totem//程序已被以totem &形式启动,当前附在pts0上8819 pts/000:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模拟终端被exit命令关闭,totem自动附在tty8819 ?00:00:00 totemdelectate@delectate:~$

具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。delectate@delectate:~$ vlc &[1] 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye[0x8b998b0] main libvlc: Running vlc with the default interface. Use ‘cvlc’ to use vlc without interface. //enter presseddelectate@delectate:~$ //show a clean terminal now** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL’ failed //仍然在输出数据…… //关闭程序[1]+ Done vlcdelectate@delectate:~$

你无法记录程序的debug输出结果。

只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)

使用nohup命令:

nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中断/挂起信号,使命令继续执行)

但是当你尝试使用命令:

1nohup command

时候却会遇到不大不小的麻烦……

delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’

是的,虽然它自动把debug信息记录到nohup.out文件,但是你却无法使用这个终端进行任何操作。

所以你需要和第一个方法混用,即

nohupcommand {option}&

混用后,它会自动把你执行的命令输出结果记录到权限为-rw——-,名为nohup.out的文件中。

但是你仍然需要

delectate@delectate:~$ nohup vlc &[1] 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out’ //在这里按一下回车或以ctrl+c以 //show a clean terminal delectate@delectate:~$

与使用 “&” 性质相同,当前启动程序的终端如果没有被关闭,已经启动的程序附在pst上;如果终端被关闭,则自动附在tty。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out。默认状态下,nohup默认输出到nohup.out文件,你也可以利用重定向来指定输出文件:

nohupcommand {option} >myout.file 2>&1 &

只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)

其他相关命令:

jobs:查看当前有多少在后台运行的命令

fg:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

bg:将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

杀死进程

杀死已经启动的程序和普通方式一样:

pkill -9 name

killall name

kill pid

命令应用:

linux服务器挂机下载;启动相关服务;linux服务器启动进程(尤其是ssh登录)

我就曾经用 1nohup aria2c -i downloadlist -m 0 -j 1 &

vi /etc/xinetd.d/telnet 在disable=yes前加#,即#disable=yes

二、要启动telnet 服务就必须重新启动xinetd [root@localhost root]#service xinetd restart

三、关闭防火墙,等。。

四、要域名访问的话,要开启路由器的 23 端口映射

五、关闭的话就是 设置成 disable=yes ,然后重启xinetd service xinetd restart 1。基础知识 linux提供服务是由运行在后台的守护程序(daemon)来执行的。 守护进程的工作就是打开1个端口(port),等待(listen)进入的连接。在C/S模式中,如果客户提请了1个连接,守护进程就创建(fork)子进程来响应这个连接,而父进程继续监听其他服务的请求。 但是,对于系统所提供的每1个服务,如果都必须运行1个监听某个端口连接发生的守护程序,那么通常意味着系统资源的浪费。为此,引入“扩展的网络守护进程服务程序”xinetd(xinetd internet daemon)。telnet服务也是由xinetd守护的。 2。检测telnet、telnet-server的rpm包是否安装 OS:RedHat9 [root@localhost root]#rpm -qa telnet telnet-0.17-25 //telnet*.rpm是默认安装的// [root@localhost root]#rpm -qa telnet-server 空 //telnet*.rpm是默认没有安装的// 3。安装telnet-server 第3张盘上有telnet-server-0.17-25.i386.rpm [root@localhost root]#rpm -ivh telnet-server*.i386.rpm 4。修改telnet服务配置文件 vi /etc/xinetd.d/telnet service telnet { disable = yes flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID } 将disable=yes行前加#,或者改为disable=no PS: 安装telnet-server后,系统才有文件/usr/sbin/in.telnetd 5。重新启动xinetd守护进程 由于telnet服务也是由xinetd守护的,所以安装完telnet-server,要启动telnet服务就必须重新启动xinetd [root@localhost root]#service xinetd restart 或 [root@localhost root]#/etc/init.d/xinetd restart 6。关闭系统的防火墙 linux系统默认的防火墙是“high” 命令行界面CLI: [root@localhost root]# setup 选择:“firewall configuration” 选择:security level——“no firewall” 7。测试 telnet IP QUOTE: Red Hat Linux release 9 (Shrike) Kernel 2.4.20-8 on an i686 login: 出现,就OK了! 8。telnet默认开机启动 1)。命令ntsysv 找到telnet,用空格键激活(*)服务 2)。命令chkconfig chkconfig --add telnet chkconfig telnet on 3)。图形用户界面GUI redhat-conhat-config-services 或 “主菜单”——“系统设置”——“服务器设置”——“服务” 4)默认下,telnet不允许root登录.通过编辑/etc/pam.d/login文件,放开root用户登录权限控制 # vi /etc/pam.d/login 在auth required /lib/security/pam_securetty.so行前加“#”号注释,注销该行。 PS: 由于telnet登陆时是明文传送密码,所以不安全,建议使用ssh(secure shell)替代! windows下一般用F-Secure SSH ,putty SSH ------------------------------------------- 四、设置telnet端口 #vi /etc/services 进入编辑模式后查找telnet(???怎样查找) 会找到如下内容: telnet 23/tcp telnet 23/udp 将23修改成未使用的端口号(如:2000),退出vi,重启telnet服务,telnet默认端口号就被修改了。 五、Telnet服务限制 如果原本的默认值你并不满意,那么你可以修改成比较安全一点的机制。假设你这个 Linux 是一部主机,而且他有两块网络接口,分别是对外的 192.168.0.1 与对内的210.45.160.17 这两个,如果你想要让对内的接口限制较松,而对外的限制较严格,你可以这样的来设定: #vi /etc/xinetd.d/telnet # 先针对对内的较为松散的限制来设定: service telnet { disable = no <==预设就是激活 telnet 服务 bind = 210.45.160.17 <==只允许经由这个适配卡的封包进来 only_from = 210.45.160.0/24 <==只允许 210.45.160.0/24 这个网段的主机联机进来使用 telnet 的服务 ..... } # 再针对外部的联机来进行限制 service telnet { disable = no<==预设就是激活 telnet 服务 bind = 192.168.0.1<==只允许经由这个适配卡的封包进来 only_from = 192.168.0.0/16<==只允许 192.168.0.0 ~ 192.168.255.255 这个网段联机进来使用 telnet 的服务 only_from = .edu.cn<==重复设定,只有教育网才能联机! no_access = 192.168.25.{10,26}<==不许这些 PC 登入 access_times = 1:00-9:00 20:00-23:59 <==每天只有这两个时段开放服务 ...... }

六、Telnet root用户的登入 root 不能直接以 telnet 连接上主机。 telnet 不是很安全,默认的情况之下就是无法允许 root 以 telnet 登入 Linux 主机的 。若要允许root用户登入,可用下列方法 [root @test /root]# vi /etc/pam.d/login #auth required pam_securetty.so #将这一行加上注释! 或 # mv /etc/securetty /etc/securetty.bak 这样一来, root 将可以直接进入 Linux 主机。不过,建议不要这样做。还可以在普通用户进入后,切换到root用户,拥有root的权限! 安全的ssh SSH是一个用来替代TELNET、Rlogin以及Rsh的传统的远程登陆程序的工具,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。SSH有两个不兼容的版本1.x,2.x!RedHat Linux 9将默认的远程管理服务设置成OpenSSH(一个ssh的替代产品)。不需要重新安装软件包! 一、配置openssh服务器 1、ssh的配置文件是/etc/ssh/ssh_config,一般不要修改! 2、启动服务器! #ntsysv =>确认将sshd前面的勾已打上! 3、手工启动OpenSSH: #service sshd start #service sshd restart(重新启动) 4、停止服务器: #service sshd stop 二、使用OpenSSH客户端 Redhat linux 9默认已安装了OpenSSH的客户端,客户端和服务器连接时,可以使用两种验证方式:基于口令的验证方式和


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/714454.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-07
下一篇2023-08-07

发表评论

登录后才能评论

评论列表(0条)

    保存