WampServer死活连不上SQLServer的解决办法

下载了Wamp Server 2.5,连接MSSQLServer 2008 R2,一直提示“Fatal error: Call to undefined function sqlsrv_connect()”。

网上的办法全都试过也还是不管用(包括ext目录中添加dll、php.ini添加dll设置、ntwdblib.dll加入system32等等)。

如果遇到类似以上问题并且山穷水尽的同学,可以往下看。

首先在此感谢解决原作者:https://blog.csdn.net/xocom/article/details/45840725

下面开始说问题原因和方法。

原因:

经测试,微软最新发布的microsoft Drivers 3.1 for PHP for SQL Server仅支持32位的php5.5版本,在win7 64位系统中安装32位wamp环境可以正常开启扩展,但是安装了64位的wamp环境就不能开启扩展,网上查发现很多人反应64位的扩展源码编译不出来。

也就是说,微软发布的DLL扩展在64位的wamp中不能用

解决办法:

下载以下安装包,找到x64目录中对应的DLL,放到你的php/ext目录下。

地址一:http://oa.jnszkj.com/ueditor/php/upload/file/20180622/1529665745721557.zip

地址二:http://www.weka.cc/ueditor/php/upload/file/20180622/1529665745721557.zip

再次感谢原作者!感谢CSDN!感谢百度!微软就不谢了。

Xcode上传后iTunes Connect构建版本不显示

原文地址:https://blog.csdn.net/qxuewei/article/details/52790357

在升级到Xcode8版本以后大多数人会碰到这个问题-开开心心开发好一款app以后上传到iTunes后台提交审核,然而iTunes Connect后台活动栏里没有出现我们上传的app,确切的说是显示一会儿之后平白无故的消失,也不见Apple的邮件告知原因,只能借助强大的网络和那些具有分享精神的巨人!
这里写图片描述

各种谷歌百度后找到解决方法,因为iOS10以后Apple更注重保护用户权限,在任何需要使用设备权限的地方都需要提前声明.
在项目中的plist文件中,添加如下字段
这里写图片描述

如下方便复制粘贴用:
麦克风权限:
Privacy – Microphone Usage Description 是否允许此App使用您的麦克风?

相册权限:
Privacy – Photo Library Usage Description 是否允许此App访问您的相册?

相机权限:
Privacy – Camera Usage Description 是否允许此App使用您的相机?

通讯录权限:
Privacy – Contacts Usage Description 是否允许此App访问您的通讯录?

地理位置权限(后台定位):
Privacy – Location Always Usage Description 是否允许此App访问您的地理位置?

地理位置权限(前台定位):
Privacy – Location When In Use Usage Description 是否允许此App访问您的地理位置?

蓝牙权限:
Privacy – Bluetooth Peripheral Usage Description 是否许允此App使用蓝牙?

日历权限:
Privacy – Calendars Usage Description 是否允许此App使用日历?

注意在复制的时候前后不要空格,并且在权限字段后一定要有描述,不然xcode会自动把这个声明删除

查到有前辈讲其中有几项权限是必需设置的,我仅仅设置麦克风,相机,相册的权限声明之后但是仍然没有构建成功,所以将这所有权限在plist文件中统一声明一下最完美,并且提醒用户的权限提示框也只有在app中代码使用到此功能才会弹出,所以不必担心影响用户体验.

所有权限字段添加完成,再次无论用Xcode还是Application loader上传成功之后,在iTunes Connect 后台就会看到成功构建的版本,提交审核就可以了!
这里写图片描述

OCX注册失败

问题一:模块加载失败 请确保该二进制文件在指定的路径中 找不到指定的模块。

解决方法:将项目配置属性—>常规—>MFC的使用 修改为在静态库中使用MFC。

问题二:模块已加载,但对DllRegisterServer.dll的调用失败,错误代码为xxxxx。

解决方法:以管理员模式来执行命令行。

Mac Xcode空间清理

原文地址:http://blog.csdn.net/cuihaiyang/article/details/56892799

128G存储空间已经剩下没多少了,必须得清理一下。

一层层查找发现~/Library/Developer目录占了15G, Xcode8占用了12G,拿它开刀。

1. 清理~/Library/Developer/CoreSimulator/Devices 该目录是存放模拟器,里面每个模拟器标识符代表一台设备,具体可见device_set.plist

关闭模拟器,执行命令

rm -rf ~/Library/Developer/CoreSimulator/Devices

删除Devices文件夹,下次启动会重新创建模拟器

2.清理~/Library/Developer/Xcode/iOSDeviceSupport 该目录是真机调试时产生的,删除后下次调试时会自动生成。

rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport

3.清理~/Library/Developer/Xcode/DerivedData 该文件夹存放项目的索引文件等,可以全部删除,或者删除不常用的项目,再次打开项目会自动生成。

4.清理~/Library/Developer/Xcode/Archives 该文件夹存放app打包生成的文件,可以删掉不需要的项目打包文件。

5.清理/Library/Developer/CoreSimulator/Profiles/Runtimes,该文件夹存放手动下载的Simulator。

清理后Xcode只剩下四百多兆大笑

React Native打包Android APK安装包出错: Original is here. The version qualifier may be implied.

React Native项目,用命令打包Android APK安装包,执行命令gradlew assembleRelease后,总是报如下错误:

/Users/liujin/Downloads/xxx/android/app/build/intermediates/res/merged/release/drawable-mdpi-v4/androidjs_imagebag_pageonei_wkt1.jpg: error: Duplicate file.

/Users/liujin/Downloads/xxx/android/app/build/intermediates/res/merged/release/drawable-mdpi/androidjs_imagebag_pageonei_wkt1.jpg: Original is here. The version qualifier may be implied.

解决办法:

用Android Studio打开android目录,找到res/drawable目录,把里面的图片文件都删掉(因为这些图片都是React Native自动生成的,所以删除即可)。再次重新执行gradlew assembleRelease命令就不会报错了。

 

附:《React Native安卓项目打包APK》

CentOS 6.5 yum install PostgreSQL 9.4

一、在/etc/yum.repos.d/CentOS-Base.repo 中的[base],[updates]中都增加:exclude=postgresql*

二、引入 PostgreSQL 9.4 Repository 官方的安装源

网址是: http://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-6.6-x86_64/pgdg-centos94-9.4-2.noarch.rpm

如果这个网址显示404 Not Found,可以进入到 http://download.postgresql.org/pub/repos/yum/9.4/redhat 目录之后,一步一步点进去,找到你要下载的那个rpm包的链接。

[plain] view plain copy

 print?

  1. rpm -Uvh http://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-6.6-x86_64/pgdg-centos94-9.4-2.noarch.rpm

三、安装

[plain] view plain copy

 print?

  1. yum install postgresql94 postgresql94-server postgresql94-contrib

四、初始化PostgreSQL数据库

[plain] view plain copy

 print?

  1. service postgresql-9.4 initdb

五、设置开机自启动

[plain] view plain copy

 print?

  1. service postgresql-9.4 start
  2. chkconfig postgresql-9.4 on

六、修改监听地址、端口

/var/lib/pgsql/9.4/data/postgresql.conf 中 把注释符号去掉,显示如下:

[plain] view plain copy

 print?

  1. listen_address=’*’
  2. port=5432

七、增加操作系统用户

[plain] view plain copy

 print?

  1. [root@wc1 ~]# adduser pgdbuser

八、创建postgresql数据库中的用户

在安装完postgresql数据库之后,会有一个默认的用户postgres,切换到postgres用户,然后执行psql命令,连接postgresql,然后再创建pgdbuser用户,最后退出

[plain] view plain copy

 print?

  1. [root@wc1 ~]# su – postgres
  2. -bash-4.1$ psql
  3. psql (9.4.11)
  4. Type “help” for help.
  5.                                         ^
  6. postgres=# create user pgdbuser  with superuser login password ‘pgdbuser’;
  7. CREATE ROLE
  8. postgres=# \q

 

九、修改/var/lib/pgsql/9.4/data/pg_hba.conf文件如下:

其中ident是linux系统下postgresql默认的local认证方式,通过操作系统用户映射的数据库用户,不需要输入密码,就可以登录。

而md5,不需要在操作系统层建立对应的同名的用户。

[plain] view plain copy

 print?

  1. # TYPE  DATABASE        USER            ADDRESS                 METHOD
  2. # “local” is for Unix domain socket connections only
  3. local   all             all                                     md5
  4. # IPv4 local connections:
  5. host    all             all             127.0.0.1/32            md5
  6. # IPv6 local connections:
  7. host    all             all             ::1/128                 md5

修改之后要重启服务:

[plain] view plain copy

 print?

  1. [root@wc1 Desktop]# service postgresql-9.4 restart
  2. Stopping postgresql-9.4 service:                           [  OK  ]
  3. Starting postgresql-9.4 service:                           [  OK  ]

十、登录postgresql

由于都是需要密码验证登录,所以当前os用户为root,需要指定登录的数据库、用户,然后按照提示输入密码后登陆。

接下来,创建数据库,显示当前数据库,切换到新建的库,创建表,插入数据,查询数据。

[plain] view plain copy

 print?

  1. [root@wc1 Desktop]# psql -d postgres -U pgdbuser
  2. Password for user pgdbuser:
  3. psql (9.4.11)
  4. Type “help” for help.
  5. postgres=# create database test;
  6. ERROR:  database “test” already exists
  7. postgres=# create database xxx;
  8. CREATE DATABASE
  9. postgres=# select current_database();
  10.  current_database
  11. ——————
  12.  postgres
  13. (1 row)
  14. postgres=# \c xxx
  15. You are now connected to database “xxx” as user “pgdbuser”.
  16. xxx=# create table tb(id int);
  17. CREATE TABLE
  18. xxx=# insert into tb values(1);
  19. INSERT 0 1
  20. xxx=# select * from tb;
  21.  id
  22. —-
  23.   1
  24. (1 row)
  25. xxx=#

如果把修改/var/lib/pgsql/9.4/data/pg_hba.conf,把第一个md5改成ident,那么登录时候,需要切换到上面创建的操作系统用户:pgdbuser,然后就可以直接登录。

[plain] view plain copy

 print?

  1. # TYPE  DATABASE        USER            ADDRESS                 METHOD
  2. # “local” is for Unix domain socket connections only
  3. local   all             all                                     ident
  4. # IPv4 local connections:
  5. host    all             all             127.0.0.1/32            md5
  6. # IPv6 local connections:
  7. host    all             all             ::1/128                 md5
重启服务。
登录:
[plain] view plain copy

 print?

  1. [root@wc1 Desktop]# psql -d postgres -U pgdbuser
  2. psql: FATAL:  Peer authentication failed for user “pgdbuser”
  3. [root@wc1 Desktop]# su – pgdbuser
  4. [pgdbuser@wc1 ~]$ psql -d postgres
  5. psql (9.4.11)
  6. Type “help” for help.
  7. postgres=# \c xxx
  8. You are now connected to database “xxx” as user “pgdbuser”.
  9. xxx=# select * from tb;
  10.  id
  11. —-
  12.   1
  13. (1 row)
  14. xxx=#

微信小程序中使用微信风格样式库-WeUI

原文地址:https://www.jianshu.com/p/f4e3212c9ca7

WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。包含button、cell、dialog、 progress、 toast、article、actionsheet、icon等各式元素。

WeUI

WeUI的官方演示地址是:https://weui.io/
WeUI的官方GitHub地址是:https://github.com/weui

WeUI最初是为HTML5的页面设计的样式库,现在微信小程序使用的样式机制也是css风格的样式机制(不过稍稍有些不一样的地方),WeUI理所当然的推出了WXSS版本。它的GitHub地址是:https://github.com/weui/weui-wxss

我们可以直接去Github上下载它的代码,也可以通过npm来方便的获取:

npm install weui-wxss

下载下来的代码中,包含了weui的源代码,以及一个基于weui的示例小程序:

示例小程序

里面包含了丰富的使用weui的示例代码,可以很好的学习weui提供的各个样式的使用。

我们可以通过微信web开发者工具来打开这个示例代码:

示例代码
button样式

你的小程序主要是通过在你的app.wxss中导入weui.wxss来导入WeUI的样式的:

@import "style/weui.wxss";

之后,就可以在小程序的各个地方使用WeUI中定义的样式了。

作者:一斤代码
链接:https://www.jianshu.com/p/f4e3212c9ca7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

mysql重连,连接丢失:The last packet successfully received from the server

原文地址:http://blog.csdn.net/dxswzj/article/details/42778031

问题原因:

其实上面的提示中已经给出了一部分的简要说明,简单来说就是: 程序启动时,在跟DB首次交互时,获得了相应的DB Connection资源,从而进行正常的DB读写操作。但是在下次进行DB读写时(我的定时任务本身设置的时间间隔是24小时),应用程序认为这个连接是可以正常使用的(程序执行过一次之后没有退出,这个连接从来并没有被释放掉),但实际上,这个连接已经坏掉了,因为Mysql本身已经把这个连接标记为timeout了。于是,应用程序“傻乎乎”的在这个已经坏掉的数据通道上发起对DB的读写请求,但是Mysql已经对这些请求不买账了。。。

 

为啥呀,mysql到底认为这个连接空闲多长时间算过期啊?

这个可以通过查看mysql的配置文件,看看是否有对这个时间做过特殊的配置,我的场景下在64位linux服务器上部署的mysql服务器,这个配置文件在:在/etc/my.cnf

如果你打开这个文件,发现并没有如下这行配置:

 

Xml代码  收藏代码
  1. wait_timeout=xxx (这里xxx是数据,单位为秒)

说明你并没有对这个timeout做过特殊配置,通常Mysql默认的配置是8小时。你也可以在登陆进入mysql之后,通过如下命令确认一下:

 

Sql代码  收藏代码
  1. show global variables like ‘wait_timeout’;

结合上面我的程序的配置(24小时执行一次),上面的问题就好解释了:24小时之后程序再次对DB进行读写操作时,Mysql单方已经认为之前connection已经timeout了(停止活动了8小时以上就认为过期了)。

如何解决:

1.1 错误信息:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 20,820,001 milliseconds ago.  The last packet sent successfully to the server was 20,820,002 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
		at sun.reflect.GeneratedConstructorAccessor29.newInstance(Unknown Source) ~[na:na]
		at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_51]
		at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_51]
		at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3988) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5372) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881) ~[c3p0-0.9.1.1.jar:0.9.1.1]
		at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98) ~[quartz-2.2.1.jar:na]

1.2 解决方法

– 如果使用的是JDBC,在JDBC URL上添加?autoReconnect=true,如:

jdbc:mysql://10.10.10.10:3306/mydb?autoReconnect=true

– 如果是在Spring中使用DBCP连接池,在定义datasource增加属性validationQuerytestOnBorrow,如:

<bean id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${countNew.jdbc.url}" />
    <property name="username" value="${countNew.jdbc.user}" />
    <property name="password" value="${countNew.jdbc.pwd}" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true"/>
</bean>

– 如果是在Spring中使用c3p0连接池,则在定义datasource的时候,添加属性testConnectionOnCheckintestConnectionOnCheckout,如:

<bean name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${cache.url}"/>
    <property name="user" value="${cache.user}"/>
    <property name="password" value="${cache.password}"/>
    <property name="initialPoolSize" value="10"/>
    <property name="maxPoolSize" value="${cache.maxPoolSize}"/>
    <property name="testConnectionOnCheckin" value="false"/>
    <property name="testConnectionOnCheckout" value="true"/>
    <property name="preferredTestQuery" value="SELECT 1"/>
</bean>

 

网页加载慢浏览器端分析方法

  1. 打开Chrome浏览器,访问要分析的网页
  2. 按下F12键,或在页面上点击右键选择“检查元素”
  3. 弹出的面板中,点击Network标签,选中里面的“Disable Cache”选项(目的是禁用缓存,否则不能体现首次访问加载所有资源的情况)
  4. 刷新网页,面板左下角会显示加载页面共请求了多少资源,共耗费多少时间,共使用了多少流量。并以表格形式显示出所有的网络资源请求,每一行一个,每行都包括请求该资源所耗费的时间、资源大小等信息。
  5. 下一步进行分析,主要从两个方面,一是请求时间,二是资源大小。
  6. 对于请求时间特别长的资源,可以看下是否该资源为国外资源,因为被墙导致访问时间长。
  7. 点击Size,按资源大小进行倒序排列,找到占用空间大的资源。

C语言Socket请求Apache服务器一直报HTTP/1.1 400 Bad Request

用C语言写了个Socket程序,发送HTTP请求到Apache服务器,一直报HTTP/1.1 400 Bad Request。尝试了无数方法,依然无果。

最终发现还是HTTP协议头的格式问题,主要就在于\r\n的问题。

把所有的\n都换成了\r\n之后,终于可以了。

注意:如果是POST请求,POST数据部分的上下要多加一个空行,也就是\r\n\r\n

Linux中如何让进程到后台运行?Linux里面程序一直运行不被中断

本文主要来自https://fukun.org/archives/06281192.html 和 http://blog.csdn.net/wangjun_1218/article/details/6835800

外加一点自己的实践。

原文如下:

https://fukun.org/archives/06281192.html

在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

Example
1
2
3
4
5
$ ./test.sh &
[1] 17208
$ jobs -l
[1]+ 17208 Running                 ./test.sh &

对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

Example
1
2
3
4
5
6
7
8
$ ./test.sh
[1]+  Stopped                 ./test.sh
bg %1
[1]+ ./test.sh &
$ jobs -l
[1]+ 22794 Running                 ./test.sh &

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

Example
1
2
3
4
5
6
7
8
9
echo $$
21734
nohup ./test.sh &
[1] 29016
ps -ef | grep test
515      29710 21734  0 11:47 pts/12   00:00:00 /bin/sh ./test.sh
515      29713 21734  0 11:47 pts/12   00:00:00 grep test
Example
1
2
3
4
5
6
$ setsid ./test.sh &
[1] 409
ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515        413 21734  0 11:49 pts/12   00:00:00 grep test

上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

Example
1
2
3
4
5
6
7
8
9
10
11
$ ./test.sh &
[1] 2539
$ jobs -l
[1]+  2539 Running                 ./test.sh &
$ disown -h %1
ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515       2542 21734  0 11:52 pts/12   00:00:00 grep test

另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:

Example
1
2
3
4
5
$ (./test.sh &)
ps -ef | grep test
515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh
515      12483 21734  0 11:59 pts/12   00:00:00 grep test

注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

Example
1
2
3
4
5
6
7
8
screen -dmS screen_test
screen -list
There is a screen on:
        27963.screen_test       (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.
screen -r screen_test
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
现在说说我的问题和解决方法:
我想在Ubuntu服务器上挂载一个socket通信的小程序,是一个server,我想让这个程序一直运行着。可是我发现一旦没有客户端来连接它,没几分钟,改程序自动关闭。这是个令人头疼的问题。
根据上面指导,解决方法如下:
输入指令:

echo $$

nohup ./tcp_demo &

ps -ef |grep tcp_demo

说明:tcp_demo是要运行的程序名称

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
原文如下:
http://blog.csdn.net/wangjun_1218/article/details/6835800
PS: 其实这并不是原文地址,这个地址的文章也是转载的,不过我发现他附的原文地址不可访问了,所以姑且把这个当做是原文吧
nohup、setsid、&和disown
2010-04-02 15:16
在执行命令时,偶尔会碰到需要让对应进程无间断执行的情况。前段时间看到IBM官网的一篇文章,由于不让转载(原文位置:IBM),遂简单记录如下:

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

1. nohup
显而易见,nohup命令的功能是使进程忽略hangup信号,从而持续执行。nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”>filename 2>&1″来更改缺省的重定向文件名。
如:nohup myUbuntuSourceSyncCmd.pl >./sources/ubuntu/sync.log 2>&1 &
这样起到了三个效果:进程后台执行;忽略hangup信号;输出重定向。

2. setsid
setsid中的sid指的是session id,意指以该命令运行的进程是一个新的session,因此其父进程id不属于当前终端。实际上,setsid运行的进程,其父进程id(PPID)为1(init 进程的 PID)。因此,setsid解决问题用的是第二种途径。
如:setsid myUbuntuSourceSyncCmd.pl >./sources/ubuntu/sync.log 2>&1 &
格式与nohup相仿,后台运行也需加上&,但输出重定向必须手动设置。

3. 括号()与&
&代表后台运行(注意输出并没有被重定向);此外,我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。
当我们将”&”也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。
如:(myUbuntuSourceSyncCmd.pl >./sources/ubuntu/sync.log 2>&1 &)
以这种方式运行程序,新提交的进程的父 ID为1,并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

4. disown
如果我们未加任何处理就已经提交了命令,这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。让我们来看一下 disown 的帮助信息:
disown [-ar] [-h] [jobspec …]
Without options, each jobspec is  removed  from  the  table  of
active  jobs.   If  the -h option is given, each jobspec is not
removed from the table, but is marked so  that  SIGHUP  is  not
sent  to the job if the shell receives a SIGHUP.  If no jobspec
is present, and neither the -a nor the -r option  is  supplied,
the  current  job  is  used.  If no jobspec is supplied, the -a
option means to remove or mark all jobs; the -r option  without
a  jobspec  argument  restricts operation to running jobs.  The
return value is 0 unless a jobspec does  not  specify  a  valid
job.
可以看出,我们可以用如下方式来达成我们的目的。
a. 用disown -h jobspec 来使某个作业忽略HUP信号。
b. 用disown -ah 来使所有的作业都忽略HUP信号。
c. 用disown -rh 来使正在运行的作业忽略HUP信号。
需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了”&”来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!
CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,慎用此方法。
示例:
root@ubuntu-server:/mnt/ftp# jobs
[1]+  Running                 ./sync_mirror.sh &
root@ubuntu-server:/mnt/ftp# disown -h %1
root@ubuntu-server:/mnt/ftp# ps -ef|grep sync_mirror.sh
root      8650 22271  0 15:08 pts/0    00:00:00 grep sync_mirror.sh
root     16748 22271  0 Mar31 pts/0    00:00:00 /bin/sh -e ./sync_mirror.sh

另外还有一个命令screen。screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能。本篇不做介绍。

无觅相关文章插件,快速提升流量