关闭SSH终端程序继续运行
问题描述:当SSH远程连接到服务器上,然后运行一个服务 ./catalina.sh start,然后把终端开闭(切断SSH连接)之后,发现该服务中断,导致网页无法访问。
解决方法:使用nohup命令让程序在关闭窗口(切换SSH连接)的时候程序还能继续在后台运行。
Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用& 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:
/usr/local/mysql/bin/mysqld_safe –user=mysql &
但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用& 结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行,并且希望在后台能够定期运行,那么就使用nohup:
nohup /root/test.php &
提示:
[~]$ appending output to nohup.out
嗯,证明运行成功,同时把程序运行的输出信息放到当前目录的nohup.out 文件中去。
nohup命令说明:
用途:不挂断地运行命令。
语法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
nohup命令及其输出文件
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup command &
使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:(也就是说自定义输出的文件名)
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。
另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样我就可以利用这些命令在后台上传和下载文件了。
思考:问题1为什么ssh一关闭,程序就不再运行了?
元凶:SIGHUP 信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:
进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。(关于孤儿进程参照:http://blog.csdn.net/hmsiwtv/article/details/7901711 )
结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了
例子:
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
[root@tivf09 root]# top
在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。
[root@tivf09 root]# ps -ef|grep top
root 5180 5128 0 01:03 pts/0 00:00:02 top
root 5857 3672 0 01:12 pts/2 00:00:00 grep top
使用pstree命令可以更清楚地看到这个关系:
[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd—bash—top
使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。
[root@tivf09 root]# ps -xj|grep 5128
5126 5128 5128 5128 pts/0 5180 S 0 0:00 -bash
5128 5180 5180 5128 pts/0 5180 S 0 0:50 top
3672 18095 18094 3672 pts/2 18094 S 0 0:00 grep 5128
关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。
[root@tivf09 root]# ps -ef|grep 5128
root 18699 3672 0 04:35 pts/2 00:00:00 grep 5128
问题2 为什么守护程序就算ssh 打开的,就算关闭ssh也不会影响其运行?
因为他们的程序特殊,比如httpd –k start运行这个以后,他不属于sshd这个进程组 而是单独的进程组,所以就算关闭了ssh,和他也没有任何关系!
[root@CentOS5-4 ~]# pstree |grep http
|-httpd
[root@CentOS5-4 ~]# pstree |grep top
|-sshd-+-sshd—bash—top
结论:守护进程的启动命令本身就是特殊的,和一般命令不同的,比如mysqld_safe 这样的命令 一旦使用了 就是守护进程运行。所以想把一般程序改造为守护程序是不可能,
问题3 使用后台运行命令& 能否将程序摆脱ssh进程组控制呢 也就是ssh关闭,后台程序继续运行?
我们做一个试验:
find / -name ‘*http*’&
利用ctrl+d 注销以后 再进入系统 会不会看见这个命令再运行?
答案是 :命令被中止了!!
因为他依然属于这个ssh进程组 就算加了&也无法摆脱!!
[root@CentOS5-4 ~]# pstree |grep find
|-sshd-+-sshd—bash—find
结论就是:只要是ssh 打开执行的一般命令,不是守护程序,无论加不加&,一旦关闭ssh,系统就会用SIGHUP终止
问题4 nohup能解决的问题
但是为了能够再注销以后 依然能后台运行,那么我们就可以使用nohup这个命令,我们现在开始查找find / -
name ‘*http*’&
,并且希望在后台运行,
那么就使用nohup:nohup find / -name “*httpd*”
此时默认地程序运行的输出信息放到当前文件夹的nohup.out 文件中去
加不加&并不会影响这个命令 只是让程序 前台或者后台运行而已
延伸:Linux命令nohup+screen命令
如果想在关闭ssh连接后刚才启动的程序继续运行怎么办,可以使用nohup。但是如果要求第二天来的时候,一开ssh,还能查看到昨天运行的程序的状态,然后继续工作,这时nohup是不行了,需要使用screen来达到这个目的。
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。
1)使用
执行screen , 按任意键进入子界面;
我用ping命令开始执行,如果下班了,但是想关闭ssh以后ping继续运行,那么按ctrl+a 再按d 这样暂停了子界面,会显示[detached]的字样,这时候 我回到了父界面;
用screen –ls查看目前子界面的状态screen -ls
There is a screen on: 22292.pts-3.free (Detached)
1 Socket in /tmp/screens/S-root,这里的22292其实是子界面的pid号;
如果回到子界面 用screen –r 22292,一下子弹到了ping 的子界面;
2)更多帮助
可以通过C-a(ctrl+a)?来查看所有的键绑定,常用的键绑定有:
C-a ?
显示所有键绑定信息
C-a w
显示所有窗口列表
C-a C-a
切换到之前显示的窗口
C-a c
创建一个新的运行shell的窗口并切换到该窗口
C-a n
切换到下一个窗口
C-a p
切换到前一个窗口(与C-a n相对)
C-a 0..9
切换到窗口0..9
C-a a
发送C-a到当前窗口
C-a d
暂时断开screen会话
C-a k
杀掉当前窗口
C-a [
进入拷贝/回滚
其他常用选项:
-c file
使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host]
不开启新的screen会话,而是断开其他正在运行的screen会话
-h num
指定历史回滚缓冲区大小为num行
-list|-ls
列出现有screen会话,格式为pid.tty.host
-d -m
启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host]
重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname
创建screen会话时为会话指定一个名字
-v
显示screen版本信息
-wipe [match]
同-list,但删掉那些无法连接的会话
使用putty登录linux后立刻自动闪出(退出)SecureCRT:all available gssapi mechanisms failed 错误
领用使用putty登录linux后立刻自动闪出(退出)
SecureCRT ssh连接服务器报all available gssapi mechanisms failed 问题
对于这种问题,一般核查的方向都在ssh服务器端,首先应该查看系统的sshd_config 是否有改动,这里服务器端跟此问题相关的参数为PasswordAuthentication,我们核查到服务器上此参数配置的为no.
问题解决
我这边出现此问题通过修改服务器sshd参数配置修复,修改/etc/ssh/sshd_config文件将参数PasswordAuthentication 改为yes
yum使用相关问题
yum使用相关问题:
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
解决办法:
一:看网络通不
二:看dns设置
三:检查yum源,如果有https开头的源,就在iptables里边设置允许443端口进出即可
常见yum源(针对redhat,centos):
epel-release
rpmforge-release
freshrpms-release
rpmfusion-free-release
atomic
其他和yum相关包:
yum-plugin-fastestmirror
yum-priorities
如果要在使用本地光盘做为yum源,那么
在/etc/yum.repos.d/Centos-Media.repo中添加:
[item_name]
baseurl=file:///medi_mout_dir
gpacheck=0
enabled=1
杀死yum进程:
ps -A | grep yum |grep -v grep | awk ‘{print $1}’ | xargs kill -9
Win 2008安装IIS7时提示安装失败,错误代码0×80070643解决方案
经过各种百度发现,这可能是微软产品的一个安装策略问题,原因就不深究了,简单说下解决方案:
1、禁用WAS,即Windows进程激活服务功能(Windows Process Activation Service)。在开始,运行,输入:
dism.exe /online /disable-Feature /featurename:WAS-WindowsActivationService
2、卸载II7,并重启计算机。
3、再次重新安装IIS7。注意重启完后。进入后需要卸载II7,有个过程,一定要点时间等跳出对话完成卸载II7。
4、启用WAS,在开始,运行,输入:
dism.exe /online /enable-Feature /featurename:WAS-WindowsActivationService
dism.exe /online /enable-Feature /featurename:NetFxEnvironment
Apache错误:(20014)Internal error: Error retrieving pid file logs/httpd.pid
今天在虚拟机上打开apache出现如下错误:
[root@www.vps12.com ~]# service httpd start
(20014)Internal error: Error retrieving pid file logs/httpd.pid
Remove it before continuing if it is corrupted.
其实这个错误就是因为Apache目录下的 logs 子目录下的 httpd.pid 文件内容是空的。这个文件是记录进程ID的文件。因为这个文件是空的,就无法启动,实在是超雷人。你随便写点数字进去,再启动Apache,就可以成功了。
[root@www.vps12.com ~]# echo 1234 > /usr/local/apache2/logs/httpd.pid
[root@www.vps12.com ~]# service httpd start
Xen Linux VPS硬盘挂载教程(重装系统不丢数据)也适用于其他多硬盘系统
之前发的那篇《Xen Linux VPS硬盘挂载教程》,利用LVM(卷组)直接填充整个Linux根分区的磁盘容量,这种做法可以最大限度的利用VPS所分配的容量,但重装后会丢失所有数据。适合一些比较小硬盘或对硬盘需求量比较大的客户。
由于现在的VPS磁盘容量越来越大,很多VPSer们也未必能用得到默认的容量,XenSystem初始化的根分区(第一磁盘“Xvda”)默认为10G,另外一个磁盘(第二磁盘“Xvdb”)为VPS总容量的剩余容量。如果单独挂载给/home,使用LNMP一键包等程序,在重装时在/home内的数据就不会丢失了。非常适合热爱折腾的客户。
注意:如果MYSQL数据并没保存在/home,重装前请注意备份。
一、查看当前硬盘情况
1 | fdisk -l |
二、新建立分区
1 | fdisk /dev/xvdb |
SSH执行以上命令,会提示下方填写区域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Command (m for help): n 新建分区 Command action e extended p primary partition (1-4) p 分区类型 Partition number (1-4): 1 分区编号 First cylinder (1-1305, default 1):1 Using default value 1 分区起始位置,默认即可 Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): 1305 结束位置,默认即可 Command (m for help): t 指定分区格式 Selected partition 1 Hex code (type L to list codes): 83 设置为Linux分区 Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w 保存 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. |
三、再次执行fdisk命令查看当前分区状态
1 | fdisk -l |
若没有问题则写入系统内核。
1 2 | yum -y install parted #如果没有以下命令,请先运行此安装命令 partprobe #若没有问题则执行此命令写入内核 |
四、将分区格式化为ext3
1 | mkfs.ext3 /dev/xvdb1 |
五、挂载到/home
1 | mount /dev/xvdb1 /home |
SSH执行以上命令,将第二硬盘挂载到/home分区。
1 | df -l |
六、写入挂载文件
1 | echo "/dev/xvdb1 /home ext3 defaults 1 3" >> /etc/fstab |
SSH执行以上命令,写入/etc/fstab,开机时自动挂载。
七、重装系统后恢复方法
在XenSystem中,选择“只格式化系统盘:(推荐)”。安装完毕后,尝试第五步开始。
解决方法:An error occurred on the server when processing the URL. Please contact the system administrator
在WINDOWS7或SERVER2008上安装了IIS7.5,调试ASP程序时出现以下错误:
An error occurred on the server when processing the URL. Please contact the system administrator
解决方法如下:
设置方法一:
以管理员身份运行CMD,将目录定位到%windir%\system32\inetsrv\,然后执行appcmd set config -section:asp -scriptErrorSentToBrowser:true。
%windir%\system32\inetsrv\appcmd set config -section:asp -scriptErrorSentToBrowser:true
设置方法二:
打开IIS7的asp设置,展开“调试属性”选项,“将错误发送到浏览器”这项默认的是False,改为True,然后点右侧的应用!如图所示:
最安全简单的sql2000数据库日志文件清除或者减小办法
相信很多使用sql2000,mssql的朋友都对日志文件过大严重影响数据库运行想过办法吧.
数据文件只有1G,但长期的数据库日志文件却有10G了,因为数据比较重要,有些手段又不好使用.
现在我找到一个快速而且不用第三方软件,最佳最安全的针对减小数据库日志文件的办法.
因为使用收缩数据库并不好使用.收缩日志文件也没有多大效果.笔者这里介绍一个最安全的减小mssql数据库日志文件的方法:
1.首先,请大家备份一次数据库,这非常简单,也是一种好习惯;
2.在需要收缩日志文件大小的数据库上点”属性”,再点”选项”,将故障还原里的”完全”改为”简单”
3.再右右数据库,”所有任务”中的”收缩数据库”
4.点右下角的”文件”,进入后,在右上角选数据库文件为”xxxx_log”,表示,准备收缩日志文件
5.就用默认的”收缩操作”—”压缩页,然后截断文件中的可用空间”
确定,这时你可以直接查看物理路径中的你需要收缩减小的相应log文件,是不是只有不到1M大小了.
这表示,你的日志文件已经安全清除了.
然后,重新回到第二步,将”简单”改为”完全”,这样,除了日志文件已缩小外,就与你以前的数据库没有任何区别了.包括你的所有设置!
建议:
为了防止日志文件无限扩大,需要将日志文件作一些限制.
方法是:数据库上右键点”属性”,点,”事务日志”,里面设置,将文件增长限制为xxxxMB,这要看你日常对数据库的操作情况了,一般设为1G是比较合适的,每隔一段时间进行一次本文所说的收缩数据库的方法,就能很好的维护了数据库,特别针对懒人,同时也备份了一次数据库!
解决linux系统CentOS 6.x下调整home和根分区大小(默认安装完成时)
解决linux系统CentOS下调整home和根分区大小:目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root,1.首先查看磁盘使用情况…
目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root
1.首先查看磁盘使用情况
1 | [root@localhost ~]# df -h |
1 2 3 4 5 6 | 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 154G 7.9G 139G 6% / tmpfs 1.9G 100K 1.9G 1% /dev/shm /dev/sda1 485M 69M 391M 15% /boot /dev/mapper/VolGroup-lv_home 299G 984M 283G 1% /home |
2、卸载/home
1 | [root@localhost ~]# umount /home |
1 2 | umount /home 如果提示无法卸载,则是有进程占用/home,使用如下命令来终止占用进程: [root@localhost ~]# fuser -m /home |
3、调整分区大小
1 | [root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G |
如果提示运行“e2fsck -f /dev/mapper/VolGroup-lv_home”,则执行相关命令:
1 | [root@localhost ~]# e2fsck -f /dev/mapper/VolGroup-lv_home |
然后重新执行命令:
1 | [root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G |
注:resize2fs 为重新设定磁盘大小,只是重新指定一下大小,并不对结果有影响,需要下面lvreduce的配合
4、挂载上/home,查看磁盘使用情况
1 2 | [root@localhost ~]# mount /home [root@localhost ~]# df -h |
5、设置空闲空间
使用lvreduce指令用于减少LVM逻辑卷占用的空间大小。可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。记得输入 “y”
1 | [root@localhost ~]# lvreduce -L 20G /dev/mapper/VolGroup-lv_home |
注:lvreduce -L 20G的意思为设置当前文件系统为20G,如果lvreduce -l 20G是指从当前文件系统上减少20G
使用lvreduce减小逻辑卷的大小。注意:减小后的大小不能小于文件的大小,否则会丢失数据。
可以使用vgdisplay命令等查看一下可以操作的大小。也可以是用fdisk -l命令查看详细信息。
1 | [root@localhost ~]# vgdisplay |
注:vgdisplay为显示LVM卷组的元数据信息
6.把闲置空间挂在到根目录下
1 | [root@localhost ~]# lvextend -L +283G /dev/mapper/VolGroup-lv_root |
注:lvextend -L +283G为在文件系统上增加283G
1 | [root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_root |
ps:这里-p命令运行完后,如果上1t左右的或是几百gb的硬盘要很长时间。一定要等他跑完。
7、检查调整结果
1 2 | [root@localhost ~]# df -h [root@localhost ~]# init 6 |
以上就可以完美的解决空间分配的问题。唯一需要注意的是。运行时间比较长,如果中断的话就有非常大的风险。不过按以上操作完成不需要担心。试过n次。没问题。
Linux下MySql出现#1036 – Table ‘ ‘is read only 错误解决方法
这两天在进行网站搬家,这次网站搬家采用直接打包mysql数据库和网页文件的形式进行迁移,上传好mysql data目录里面的网站数据库至VPS上mysql存放数据库的目录里面,解压就行。我的VPS存放数据库的路径是 /usr/local/mysql/var。
上传好网站数据,解压,配置好数据库链接参数就行,网站就能正常连接上了,我本以为这已 经是顺利迁移完成了,但后来操作的时候,发现只能读取数据库的内容,不能更改写入任何信息,提示#1036 – Table ‘* ‘ is read only (*号为任意表),也就是说表只有只读属性。
通过SSH,给数据库文件777权限,admin是我的数据库文件夹
1、chmod -R 0777 /usr/local/mysql/var/admin/
给数据库目录的所属用户和组改为MySQL
2、
chown -R mysql:mysql admin
但是这样还不能更改数据库,首先,找到mysqladmin所在位置,一般都在mysql/bin下面,我的在/usr/local/mysql/bin 里面,还需要运行以下命令:
3、./mysqladmin -u root -p flush-tables
之后输入root账号的密码,马上就好了,没有任何任何提示,然后测试一下,能正常读写,搬家也就顺利完成。
