精华内容
下载资源
问答
  • 我有一个应用,我期望他在任务管理器里面显示为 Doubi 这样大家就知道这是一个逗比进程。但是我更改了程序集名,也就是 exe 文件名都没有什么用,因为在任务管理器里面通过 AssemblyTitle 属性决定显示进程名。...

    我有一个应用,我期望他在任务管理器里面显示为 Doubi 这样大家就知道这是一个逗比进程。但是我更改了程序集名,也就是 exe 文件名都没有什么用,因为在任务管理器里面通过 AssemblyTitle 属性决定显示的进程名。本文来告诉大家如何更改 AssemblyTitle 的值

    在旧版本的 Franken-proj 格式的 csproj 格式里面,在项目都有一个 Properties\AssemblyInfo.cs 文件,通过修改这个文件的 AssemblyTitle 属性,就可以更改软件在任务管理器上显示的进程名

    [assembly: AssemblyTitle("Doubi")]
    

    可以自定义这个特性值,我的团队就采用了预编译技术,根据定制版本的不同,修改这个文件返回不同的值

    更改之后,可以在任务管理器上看到进程名的更改

    在更新到新的 VS 2017 的 SDK Style 的 csproj 格式,默认没有给 Properties\AssemblyInfo.cs 文件,如果此时大家自己创建一个 Properties\AssemblyInfo.cs 文件,那么在构建的时候将会提示 Error CS0579 Duplicate 'System.Reflection.AssemblyTitleAttribute' attribute 原因是当前的 AssemblyInfo.cs 是生成的。如果想要加上 Properties\AssemblyInfo.cs 文件,就需要在 csproj 上设置不要自动生成 AssemblyInfo.cs 文件

    <PropertyGroup>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>

    在 csproj 文件上添加了上面代码,将不会生成 AssemblyInfo 的所有内容。如果仅仅只是不想生成 AssemblyTitle 属性,那么请将 GenerateAssemblyInfo 属性替换为 GenerateAssemblyTitleAttribute 属性

    <PropertyGroup>
        <GenerateAssemblyTitleAttribute>false</GenerateAssemblyInfo>
    </PropertyGroup>

    但更推荐的做法是在 csproj 上指定 AssemblyTitle 属性,如下面代码

        <AssemblyTitle>Doubi</AssemblyTitle>

    以下是全的 csproj 内容,为了方便大家了解上面的代码写在哪

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <UseWPF>true</UseWPF>
        <AssemblyTitle>Doubi</AssemblyTitle>
      </PropertyGroup>
    
    </Project>

    设置了 AssemblyTitle 属性,可以在输出的程序集右击属性,在文件属性详细里面看到文件说明就是对应这个属性的内容

    这是一个用来给人类友好的属性,因此可以使用空格和中文等

    那么这个值最终会放入到输出的 PE 格式的 exe 文件的哪里?其实是放在 Win32 的 Resource 里面

    通过 FileAlyzer 工具的辅助,可以在 Reousrce 里面找到 FileDescription 属性

    本文代码放在github欢迎大家访问

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • 任务管理器实际上是用了SysListView32控件,所以发点消息就可以解决(但是发点消息也没那么容易) ListView_GetItemText宏只是对当前进程有效,对远程进程是无效的,但是label之类的控件gettext对远程进程是有效的...

    网上的都不能用啊…全是未完成代码或者兼容性极差的代码。自己写呗。
    任务管理器实际上是用了SysListView32控件,所以发点消息就可以解决(但是发点消息也没那么容易)
    ListView_GetItemText宏只是对当前进程有效,对远程进程是无效的,但是label之类的控件gettext对远程进程是有效的,具体的可以看《Windows via C/C++》中文第5版第579面(只是记得有这个特性,但不记得书中多少面提到了。特地翻书找到了这一面,不容易)。

    成品:http://download.csdn.net/download/wwh1004/10244689

    比较关键的代码在下面

    /// <summary>
    /// 读取字符串,如果读取到非托管进程中,并且读取为LPSTR LPWSTTR BSTR等字符串类型,请自行转换为byte[]并使用<see cref="ReadBytes(uint, Pointer, byte[])"/><see cref="ReadBytes(uint, IntPtr, byte[])"/>
    /// </summary>
    /// <param name="processHandle">进程句柄</param>
    /// <param name="addr">地址</param>
    /// <param name="value"></param>
    /// <param name="bufferSize">缓存大小</param>
    /// <param name="doubleZero">是否以2个\0结尾(比如LPWSTR以2个字节\0结尾,而LPSTR以1个字节\0结尾)</param>
    /// <param name="encoding">编码</param>
    /// <returns></returns>
    internal static unsafe bool ReadStringInternal(IntPtr processHandle, IntPtr addr, out string value, int bufferSize, bool doubleZero, Encoding encoding)
    {
        if (encoding == null)
            throw new ArgumentNullException(nameof(encoding) + "不能为null");
        if (bufferSize <= 0)
            throw new ArgumentOutOfRangeException(nameof(bufferSize) + "小于等于0");
    
        byte[] buffer;
        uint numberOfBytesRead;
        List<byte> bufferList;
        bool lastByteIsZero;
    
        buffer = null;
        numberOfBytesRead = 0;
        bufferList = new List<byte>(bufferSize);
        lastByteIsZero = false;
        for (int i = 0; i < int.MaxValue; i++)
        {
            buffer = new byte[bufferSize];
            ReadProcessMemory(processHandle, addr + bufferSize * i, buffer, (uint)bufferSize, &numberOfBytesRead);
            //读取到缓存
            if ((int)numberOfBytesRead == bufferSize)
            {
                //读取完整
                for (int j = 0; j < bufferSize; j++)
                {
                    if (buffer[j] == 0)
                    {
                        //出现\0
                        if (doubleZero)
                        {
                            //如果双\0结尾
                            if (lastByteIsZero)
                                //上一个字节为\0
                                goto addLastRange;
                            if (j + 1 != bufferSize)
                            {
                                //不是缓存区最后一个字节
                                if (buffer[j + 1] == 0)
                                    //下一个字节也为\0
                                    goto addLastRange;
                            }
                            else
                                //缓存读完,标记上一个字节为\0
                                lastByteIsZero = true;
                        }
                        else
                            //不是2个\0结尾,直接跳出
                            goto addLastRange;
                    }
                    else
                    {
                        if (lastByteIsZero)
                            //上一个字节为\0,但当前字节不是
                            lastByteIsZero = false;
                    }
                }
            }
            else if (numberOfBytesRead == 0)
            {
                //读取失败
                value = null;
                return false;
            }
            else
            {
                //读取不完整
                for (int j = 0; j < (int)numberOfBytesRead; j++)
                {
                    if (buffer[j] == 0)
                    {
                        //出现\0
                        if (doubleZero)
                        {
                            //如果双\0结尾
                            if (lastByteIsZero)
                                //上一个字节为\0
                                goto addLastRange;
                            if (j + 1 != (int)numberOfBytesRead && buffer[j + 1] == 0)
                                //不是缓存区最后一个字节且下一个字节也为\0
                                goto addLastRange;
                        }
                        else
                            //不是2个\0结尾,直接跳出
                            goto addLastRange;
                    }
                    else
                    {
                        if (lastByteIsZero)
                            //上一个字节为\0,但当前字节不是
                            lastByteIsZero = false;
                    }
                }
            }
            bufferList.AddRange(buffer);
        };
        addLastRange:
        numberOfBytesRead -= doubleZero ? 2u : 1u;
        for (int i = 0; i < (int)numberOfBytesRead; i++)
            bufferList.Add(buffer[i]);
        if (encoding.CodePage == Encoding.Unicode.CodePage)
            buffer = bufferList.ToArray();
        else
            buffer = Encoding.Convert(encoding, Encoding.Unicode, bufferList.ToArray());
        fixed (void* p = &buffer[0])
            value = new string((char*)p);
        return true;
    }
    
    /// <summary>
    /// 在远程进程中读取结构
    /// </summary>
    /// <typeparam name="TStruct"></typeparam>
    /// <param name="hWnd">控件句柄</param>
    /// <param name="structure">读取出的结构体</param>
    /// <param name="callbackBeforeRead">读取前回调方法</param>
    /// <param name="callbackAfterRead">读取后回调方法</param>
    /// <returns></returns>
    public static unsafe bool ReadStructRemote<TStruct>(IntPtr hWnd, out TStruct structure, Func<IntPtr, IntPtr, bool> callbackBeforeRead, Func<IntPtr, IntPtr, bool> callbackAfterRead) where TStruct : IWin32ControlStruct
    {
        uint processId;
        IntPtr hProcess;
        bool is64;
        IntPtr remoteAddr;
    
        structure = default(TStruct);
        processId = Process.GetProcessIdByHWnd(hWnd);
        //获取控件所在进程ID
        hProcess = OpenProcessRWQuery(processId);
        //打开进程
        if (hProcess == IntPtr.Zero)
            return false;
        if (!Process.Is64ProcessInternal(hProcess, out is64))
            return false;
        if (is64 && !Environment.Is64BitProcess)
            throw new NotSupportedException("目标进程为64位但当前进程为32位");
        try
        {
            remoteAddr = VirtualAllocEx(hProcess, IntPtr.Zero, structure.Size, MEM_COMMIT, PAGE_READWRITE);
            //在控件所在进程分配内存,用于储存structure
            try
            {
                if (callbackBeforeRead != null)
                    if (!callbackBeforeRead(hProcess, remoteAddr))
                        return false;
                if (!ReadProcessMemory(hProcess, remoteAddr, structure.ToPointer(), structure.Size, null))
                    //从远程进程取回到当前进程失败
                    return false;
                if (callbackAfterRead != null)
                    if (!callbackAfterRead(hProcess, remoteAddr))
                        return false;
                return true;
            }
            finally
            {
                VirtualFreeEx(hProcess, remoteAddr, 0, MEM_RELEASE);
                //释放之前分配的内存
            }
        }
        finally
        {
            CloseHandle(hProcess);
            //关闭句柄
        }
    }
    
    /// <summary>
    /// 获取列表视图控件中Item的文本
    /// </summary>
    /// <param name="i">The index of the list-view item.</param>
    /// <param name="iSubItem">The index of the subitem. To retrieve the item text, set iSubItem to zero.</param>
    /// <returns></returns>
    public unsafe string GetItemText(int i, int iSubItem)
    {
        LVITEM item;
        IntPtr pStr;
        string text;
    
        text = null;
        pStr = IntPtr.Zero;
        item = new LVITEM
        {
            iSubItem = iSubItem,
            cchTextMax = 0x1000
        };
        Util.WriteStructRemote(Handle, ref item, (IntPtr hProcess, IntPtr addr) =>
        {
            pStr = VirtualAllocEx(hProcess, IntPtr.Zero, 0x1000, MEM_COMMIT, PAGE_READWRITE);
            //分配内存用于写入字符串
            if (pStr == IntPtr.Zero)
                return false;
            item.pszText = (char*)pStr;
            //设置缓存区地址
            return true;
        }, (IntPtr hProcess, IntPtr addr) =>
        {
            try
            {
                if (ListView_GetItemText(Handle, i, addr, 0x1000) == 0)
                    return false;
                return MemoryIO.ReadStringInternal(hProcess, (IntPtr)item.pszText, out text, 0x1000, true);
            }
            finally
            {
                VirtualFreeEx(hProcess, pStr, 0, MEM_RELEASE);
            }
        });
        return text;
    }

    别的实现起来就挺简单了

    using System;
    using System.Threading;
    using FastWin32.Control;
    using FastWin32.Diagnostics;
    
    namespace 隐藏进程Demo
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                RemoveItemLoop("chrome.exe", "conhost.exe", "RuntimeBroker.exe", "svchost.exe", "隐藏进程Demo.exe");
            }
    
            /// <summary>
            /// 移除循环
            /// </summary>
            /// <param name="name">进程名</param>
            private static void RemoveItemLoop(params string[] names)
            {
                if (names == null || names.Length == 0)
                    throw new ArgumentNullException();
    
                while (true)
                {
                    foreach (string name in names)
                        RemoveItem(name);
                    Thread.Sleep(100);
                }
            }
    
            /// <summary>
            /// 从任务管理器中移除进程
            /// </summary>
            /// <param name="name">进程名</param>
            /// <returns></returns>
            private static bool RemoveItem(string name)
            {
                IntPtr hWnd;
                SysListView32 listView;
                int count;
                string text;
    
                hWnd = GetListViewHandle();
                if (hWnd == IntPtr.Zero)
                    return false;
                listView = new SysListView32(hWnd);
                count = listView.GetItemCount();
                if (count == 0)
                    return false;
                name = name.ToUpperInvariant();
                for (int i = count - 1; i >= 0; i--)
                {
                    text = listView.GetItemText(i, 0);
                    if (text == null)
                        continue;
                    if (text.ToUpperInvariant() == name)
                        listView.DeleteItem(i);
                }
                return true;
            }
    
            /// <summary>
            /// 获取任务管理器列表控件句柄
            /// </summary>
            /// <returns></returns>
            private static IntPtr GetListViewHandle()
            {
                IntPtr hWnd;
    
                if (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor == 1)
                {
                    //Win7
                    hWnd = Window.FindWindow(null, "Windows 任务管理器");
                    if (hWnd == IntPtr.Zero)
                        return IntPtr.Zero;
                    hWnd = Window.FindWindow(hWnd, IntPtr.Zero, null, "Processes");
                    if (hWnd == IntPtr.Zero)
                        return IntPtr.Zero;
                    return Window.FindWindow(hWnd, IntPtr.Zero, "SysListView32", "进程");
                }
                else
                {
                    //Win8.1 Win10 别的系统未适配
                    hWnd = Window.FindWindow(null, "任务管理器");
                    if (hWnd == IntPtr.Zero)
                        return IntPtr.Zero;
                    hWnd = Window.FindWindow(hWnd, IntPtr.Zero, null, "TaskManagerMain");
                    if (hWnd == IntPtr.Zero)
                        return IntPtr.Zero;
                    hWnd = Window.FindWindow(hWnd, IntPtr.Zero, "DirectUIHWND", null);
                    if (hWnd == IntPtr.Zero)
                        return IntPtr.Zero;
                    Window.EnumChildWindows(hWnd, (IntPtr hChildWnd) =>
                    {
                        hWnd = Window.FindWindow(hChildWnd, IntPtr.Zero, "SysListView32", null);
                        if (hWnd == IntPtr.Zero)
                            return true;
                        else
                            return false;
                    });
                    return hWnd;
                }
            }
        }
    }
    

    去年写的放寒假才发出来,原因是作业太多,学习好累啊…

    展开全文
  • 启动后发现在任务管理器找不到进程是吧 nginx有一个logs文件目录,打开看是里面的error.log会记载什么错 此处日志里报的是1113: No mapping for the Unicode character exists in the target mul 这个错是由于你存放...

    启动后发现在任务管理器找不到进程是吧
    nginx有一个logs文件目录,打开看是里面的error.log会记载什么错
    此处日志里报的是1113: No mapping for the Unicode character exists in the target mul
    这个错是由于你存放nginx的目录在中文目录下造成的,在一个上级目录没有中文的盘符里存放这个nginx吧

    展开全文
  • System Explorer任务管理器能够完全取代系统自带的任务管理器显示当前运行中的应用程序,你可以点击列表中任何文件名称以查看相关文件的详细信息,能够结束任务,将任务切换至或者新建任务。系统资源管理安全...
  • 拥有windows任务管理器中的所有常用进程管理功能,并根据实际应用需要,增加了进程快照保存、精简进程进程文件属性查看、快速进入进程所在文件目录、直接复制、删除进程文件、上网搜索进程相关资料、分色显示不同...
  • PHP 进程管理器 PHP-FPM

    2021-03-24 12:53:58
    php-fpm是什么php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。php-fpm的工作原理php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,...

    db6171ec1b1849b692e29ab020b618ab.png

    php-fpm是什么

    php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。

    php-fpm的工作原理

    php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。

    启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。

    当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog 配置。

    如何查看php-fpm进程与子进程

    查看php-fpm相关的所有进程。如下图

    dd6fd44f52e07cb5568edb29e33d99f5.png

    这里pool www皆是php-fpm的子进程,也就是我们常说的work进程。

    查看php-fpm下面的子进程

    通过上面的命令,其实我们能够看出php-fpm相关的进程了,如果我们需要更加直观的查看php-fpm的master进程和work进程,可以通过下面的方式进程查看。

    这里的5370则是php-fpm的master进程号。通过上面的命令已经很能直观的得出。

    3014520b5ef93a37bedf0b2aa780b133.png

    通过上面的命令,可以看出php-fpm作为master进程,下面有15个子进程。这里的子进程数都是可以进程自定义配置。通过如下几个参数进程配置:pm = dynamic # 动态创建子进程

    pm.max_children = 20 # 最大子进程数

    pm.start_servers = 15 # 初始化php-fpm进程时,默认的子进程数

    php-fpm参数配置说明

    php-fpm全局配置参数#php-fpm的运行权限。

    #以什么用户什么组的权限来运行池fpm。

    user = www

    group = www

    #php-fpm的运行方式,可以使端口,也可以使socke文件。

    #如果是端口则是走tcp,如果是socket则直接读socket文件,这样性能相对更好。

    listen = 127.0.0.1:9000

    #拥有socket权限的用户,需要和上面的user、group配置相结合。

    #如果采用的端口的方式,则不配置。

    listen.owner = www

    listen.group = www

    listen.mode = 0660

    #这是php-fpm端口连接的地址。多个用","隔开。默认任意地址都可以连接。

    #例如Nginx和php-fpm不在同一台服务器上,这里的值就是Nginx服务的ip地址。

    #当Nginx和php-fpm配置在同一台服务器上,则直接写127.0.0.1即可。

    listen.allowed_clients = 127.0.0.1

    #pid进程文件存放的位置,当我们启用一个php服务,

    #则会自动创建一个该pid文件,其实我们可以直接把该文件理解理解php-fpm的进程号文件,

    #两则是等价的。默认为none。

    pid = /opt/remi/php72/root/var/run/php-fpm/php-fpm.pid

    #错误日志位置,默认:安装路径 #INSTALL_PREFIX#/log/php-fpm.log。

    #如果设置为syslog,log就会发送给syslogd服务而不会写进文件里。

    error_log = /opt/remi/php72/root/var/log/php-fpm/error.log

    #PHP限制的文件扩展名

    security.limit_extensions = .php .php3 .php4 .php5 .php7

    #系统日志标示,如果跑了多个fpm进程,需要用这个来区分日志是谁的。

    syslog.ident = php-fpm

    #日记登记,可选:alert, error, warning, notice, debug。

    log_level = notice

    #紧急重启阈值,需要与下面emergency_restart_interval参数一起配置。

    emergency_restart_threshold = 60

    # 紧急重启阈值的时间范围。在此参数设置的时间内,

    # 出现SIGSEGV或SIGBUS的子进程数超过emergency_restart_threshold参数设置的值。

    # 那么fpm就会优雅的重启,值是0表示off这个功能,可用的单位有:s秒,m分,h时,d天。

    emergency_restart_interval = 60s

    #设置子进程接受主进程复用信号的超时时间。

    process_control_timeout = 0

    #当动态管理子进程时,fpm最多能fork多少个进程,0表示无限制,

    # 这是所有进程池能启动子进程的总和,谨慎使用。

    process.max = 128

    #设置子进程的优先级,在master进程以root用户启动时有效;

    #如果没有设置,子进程会继承master进程的优先级,值范围-19(最高)到20(最低),默认不设置。

    process.priority = -19

    #设置成no用于调试bug,默认为yes。

    daemonize = yes

    #master进程最多能打开的文件数量。默认采用系统设置的值。

    rlimit_files = 1024

    #master进程核心rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。

    rlimit_core = 0

    #事件处理机制,默认自动检测,可选值:select,poll,

    #epoll(linux>=2.5.44),kqueue,/dev/poll,port

    events.mechanism = epoll

    #fpm想系统发送状态的频率。单位有s,m,h。

    #前提是fpm被设置会系统服务。

    systemd_interval = 10s

    php-fpm的进程进程池配置#php-fpm的队列长度。

    listen.backlog = 65535

    #php进程池权限,同样要master进程是root用户才有效,

    #和上面的全局设置一样,不设置的话会继承master进程的优先级。

    process.priority = -19

    #子进程管理方式

    #static(静态配置,在启动php-fpm时根据该值创建固定的子进程数量);

    #dynamic(动态配置,在启动php-fpm时根据pm.start_servers的值初始化对应的子进程数,至少一个子进程);

    #ondemand(按需配置,在启动php-fpm时不创建子进程,而是根据请求动态fork子进程);

    pm = dynamic

    #最大子进程数量

    pm.max_children = 5

    #初始化子进程数量,与上面的pm = dynamic配置使用。

    pm.start_servers = 2

    #服务器闲置时最少保持2个子进程,不够这个数就会创建,只适用动态dynamic管理方式

    pm.min_spare_servers = 2

    #服务器闲置时最多要有几个,多了会kill,只适用动态dynamic管理方式

    pm.max_spare_servers = 3

    #子进程闲置时间,也就是说子进程没有可处理的任务时,在该之间使就会被killed。

    pm.process_idle_timeout = 10s

    #每个子进程最大的处理请求数量。在一定程度上可以防止内存泄漏。

    pm.max_requests = 500

    #php-fpm状态监控的uri

    pm.status_path string

    #php-fpm监控页面的 ping 网址。

    #如果没有设置,则无法访问 ping 页面。

    #该页面用于外部检测php-fpm是否存活并且可以响应请求。请注意必须以斜线开头(/)。

    ping.path string

    #用于定义ping请求的返回响应。返回为 HTTP 200 的 text/plain 格式文本。默认值:pong。

    ping.response string

    #设置worker的nice(2)优先级(如果设置了的话)。

    #该值从 -19(最高优先级) 到 20(更低优先级)。

    #默认值:不设置

    process.priority int

    #检测路径时使用的前缀

    prefix string

    #访问文件日志,没啥用处,比如yii2每次都记录访问index.php,只是记录真实的PHP文件。

    access.log = var/log/$pool.access.log

    #php的慢日志

    slowlog = var/log/$pool.log.slow

    #慢日志时间阈值

    request_slowlog_timeout = 2s

    #单个请求的超时时间,当php.ini设置的最大执行时间未生效,则交由它来处理。

    request_terminate_timeout = 3s

    #最大打开句柄数,默认为系统值。

    rlimit_files = 1024

    #最多的核心使用数,默认为系统分配。

    rlimit_core = 0

    部分配置演示

    php-fpm的backlog大小设置

    php-fpm的backlog大小设置与php-fpm的处理能力有关,而不是越大越好。

    当该值设置过大,导致php-fpm处理不过来,nginx那边等待超时,断开连接,报504 gateway timeout错。同时php-fpm处理完准备write 数据给nginx时,发现TCP连接断开了,报“Broken pipe”。

    当该值设置过小,nginx之类的client请求,根本进入不了php-fpm的accept queue,报“502 Bad Gateway”错。所以,这还得去根据php-fpm的QPS来决定backlog的大小。计算方式最好为QPS=backlog。

    php-fpm启动模式

    php-fpm以socket启动或者端口启动,这两种的方式根据实际情况进行配置。

    nginx和php-fpm在同一台服务器上,这时可以直接用unix socket进程间通信,不走tcp端口通信,可以节约创建连接的时间,从而提高性能。sock文件随便创建到哪里都可以,只要fpm有权限在那个目录里写文件,nginx有权限去读就可以。tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下文切换,更少的资源占用。不过只能在nginx和fpm在同一台机器上才能用socket。

    如何选择socket启动还是端口启动。

    由于tcp方式相对unix的方式,并发量更高,因此针对并发量高的项目,建议采用tcp方式,现在Nginx配置示例文件默认的也是tcp方式。

    使用unix方式,可以优化的点,就是将socket文件放在/dev/shm目录下面,大致的意思,就是该目录下面的文件是不是存储再硬盘中的,而是存储再内存中的。至于硬盘读取和内存读取,谁快谁慢,肯定是内存最快了。

    socket方式启动如何查看socke文件。

    socket文件是根据上面提到的pid配置项而定的。我们可以直接使用cat命令,查看进程号。

    cf6694dacb02edf77570c37520c08666.png

    子进程默认启动数量,通过上面的pm = dynamic 配置,我们知道这种方式是动态配置子进程大小的,同时我们也可以设置默认的子进程数。pm = dynamic

    pm.max_children = 20

    ### 默认15个子进程,演示的效果就是上面的shell命令的结果图。

    pm.start_servers = 15

    当我们尝试设置为3时,显示如下错误信息。

    ad0b277c6745143b91c8ece0060183e2.png

    说明,这里的start_servers配置项和min_spare_servers配置是有一定的关系的。我们设置为最小10,结果就能正常启动php-fpm了。

    推荐教程:《PHP》

    展开全文
  • 宝塔任务管理器使用帮助一、【进程】描述:追踪每个进程的CPU/内存/磁盘使用情况,点击进程名称可查看该进程更详细的信息排序:默认按CPU使用率降序,用户可点击每列头部进行排序名词解释:io读/io写:进程每秒读写...
  • HackerJLY 进程管理器

    2012-08-24 17:56:56
    HackerJLY 进程管理器(支持:批量进程结束) 1、功能介绍: 高效获取/结束进程 支持多语言(中文简体、中文繁体、英文),可根据操作系统版本语言自定软件语言,也可任意设置,并提供保存 绿色软件,只有一个文件...
  • 操作系统课设第4题,任务是在linux环境下使用gtk完成类似windows任务管理器的功能。 源代码参看https://github.com/kd-hua/for_blog/blob/main/gtk_manager.c 本任务需要了解linux下proc目录,以及gtk的各项函数...
  • 进程ID(Process ID,PID)号码被用来标记各个进程 UID、GID、和SELinux语境决定对文件系统的存取和访问权限,这些属性通常从执行进程的用户来继承,并且进程存在生命周期,每个进程进程号是唯一的centos linux的第...
  • 有用户发现打开win10的任务管理器后找不到Explorer.exe进程。这可如何是好呢,其实在Windows10中只不过将explorer.exe命名为了中文名Windows 资源管理。其它操作方法基本是类似的,为了帮助大家了解,这里小编给...
  • Linux 进程及作业管理==============================================================================概述:我们在实际的运维工作中经常要对服务器做各种监控,以了解其相关状态,比如,CPU利用率,磁盘空间利用...
  • 进程调度Linux进程调度的目标1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效;...多任务:多进程同时运行抢占式多任务进程分类:CPU bound:...
  • 1.首先我们要了解什么是进程进程是已启动的可执行程序的运行实例,进程有以下组成部分:• 已分配内存的地址空间;• 安全属性,包括所有权凭据和特权;• 程序代码的一个或多个执行线程;• 进程状态。程序: 二...
  • 15.1 进程的基本介绍(1)在linux中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号。(2)每一个进程都会对应一个父进程,而这个父进程可以复制多个子线程。例如:www服务器(3)每个进程都可能以两种方式存在...
  • Linux 进程及作业管理概述:一...唯一标识进程的是进程描述符(PID),在linux内核中是通过task_struck和task_list来定义和管理进程的;进程 Process: 运行中的程序的一个副本,是被载入内存的一个指令集合; ˙进程ID(...
  • php-fpm是什么php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。相关学习推荐:PHP编程从入门到精通php-fpm的工作原理php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读...
  • 程序进程隐藏软件可以对用户系统正在运行的进程进行隐藏...隐藏进程,系统任务管理器及一些其他任务管理器无法查到 2.恢复隐藏的进程,可恢复被隐藏的进程 3.保护进程,系统任务管理器及一些其他任务管理器无法结束和访
  • 桌面窗口管理器

    2021-06-15 00:44:11
    桌面窗口管理器是Vista中的一个新组件:Desktop Window Manager(DWM)。它建立在WPF核心图形层组件基础之上。DWM的桌面合成是建立在Composition引擎基础之上的新特征。它的出现几乎改变了Vista中应用程序的屏幕象素...
  • 我们在界面上看到的都是一个个的view3)有个ActivityManager的管理服务类,用于维护与管理Activity的启动与销毁;Activity启动时,会把Activity的引用放入任务栈中4)一个应用程序可以被别的应用...
  • 1. htop简介Htop是一款运行于Linux系统监控与进程管理软件,用于取代Unix下传统的top。与top只提供最消耗资源的进程列表不同,htop提供所有进程的列表,并且使用彩色标识出处理器、swap和内存状态。用户一般可以在...
  • Android中的AMS的职责是比较多的,其中一个比较重要的职责就是app进程管理,比如我们调用startActivity方法启动一个activity的时候,可能对应的那个进程没有启动,因此需要启动那个进程,而且对于这个进程还要有...
  • 可以完美监控和结束所有运行中的程序,纯中文显示,支持win7系统
  • 前言关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己动手总结下。有同学会问了,整这个干甚?简单的说就是,可以让一个php脚本一直处于运行的状态...
  • Jnc Process master 1.2功能: 1.ta可以结束进程,并且能够强力结束... [3.ta可以保护进程,XP下完美保护进程,Xuetr显示应用层拒绝访问,任务管理器也拿进程没办法,Windows7下的进程保护也蛮强的哦! 4.ta可以挂起进程,并
  • 怎么查看linux进程

    2021-04-26 17:24:00
    在Linux系统中,每个程序启动后可以创建一个或多个进程。... (推荐学习:linux教程)常用的进程查看命令1.ps命令——查看静态的进程统计信息(Processes Statistic)常见的选项:a:显示当前终端下的所有进程信息,...
  • 症状:点击Nginx.exe或者命令行输入start Nginx后,有一闪而过的迹象,但进程里找不到,命令行也没有提示; 原因之一:解压路径中带有中文字样; 解决方案:重新解压到一个没有中文字样的文件夹下或者直接解压到C盘...
  • Azkaban是一个分布式工作流管理器,被LinkedIn用来解决Hadoop的作业依赖性问题。我们从ETL作业到数据分析产品中也有许多工作需要按照顺序运行。 使用场景 在大数据业务处理场景中,经常有这样的分析场景: 任务A:将...
  • Windows任务管理器原理+内存管理机密+揭穿内存优化工具的骗局原文:The Memory-Optimization Hoax:RAM optimizers make false promises 作者:Mark Russinovich 译者:盆盆 ...也许会经常看到一些弹出广告
  • VB6.0制作一个支持多语言菜单的进程监视程序,多语种的菜单,在语言选项里,你可以选择英文和中文这两种菜单语言,任务管理器显示系统正在运行的进程、可停止和查询相关进程。可显示每一条进程的ID、名称、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,008
精华内容 16,003
关键字:

任务管理器进程怎么显示中文