linuxsuspend
㈠ 如何在Android 或linux 下,做Suspend /Resume 的Debug
常常使用console做为suspend function的debug的Information source,但原始的source code在suspend过程中,会将console关掉。
所以我们看到一定程度后就再也看不到message了。
但是我们并不知道在Suspend的过程中,系统到底发生了什么事,可能造成无法suspend。
为此,我们就会在kernel 启动参数中加上no_console_suspend这个参数。在AM/DM37x APM中是修改boot.scr档案参数
㈡ linux下如何暂停一个进程
kill
-STOP
1234
将该进程暂停。
如果要让它恢复到后台,用kill
-CONT
1234
(很多在前台运行的程序这样是不行的)
如果要恢复到前台,请在当时运行该进程的那个终端用
jobs命令查询暂停的进程。
然后用
fg
〔job号〕把进程恢复到前台。
如果jobs只查询到一个进程,只用
fg
即可。
例:
root@dWorks:~#
bc
-q
[1]+
Stopped
bc
-q
root@dWorks:~#
bc
-q
[2]+
Stopped
bc
-q
root@dWorks:~#
jobs
[1]-
Stopped
bc
-q
[2]+
Stopped
bc
-q
root@dWorks:~#
fg
2
bc
-q
1+1
2
㈢ linux 如何立刻suspend usb
suspend:
#disableexternalwake-up;dothisonlyonce
echodisabled>/sys/bus/usb/devices/usb1/power/wakeup
echosuspend>/sys/bus/usb/devices/usb1/power/level#turnoff
wake up:
echoon>/sys/bus/usb/devices/usb1/power/level#turnon
根据你的实际情况修改usb1为usb n
㈣ Linux触摸屏驱动中什么时候会调用suspend这个函数
android系统摁下电源键后会让系统进入休眠以达到节电的目的。内核驱动中和休眠相关的就是suspend和resume函数。
suspend函数用于休眠,resume函数用于唤醒。下面分析驱动中的这两个函数是如何被调用到的。
驱动部分:
首先需要分析驱动的注册过程,较新的内核都是采用DTS方式来取代在内核中直接定义platform_device数据结构的注册方式,本文是基于DTS机制的内核来分析。
proct对应的dts文件在编译时被编译为dtb文件,uboot在启动时候会将其地址传给内核,内核在启动过程中会去解析,具体解析是在start_kernel()->setup_arch() --> unflatten_device_tree()中具体分析可以参考网上,解析的最终结果会存放在allnodes地址处,这个allnodes随后在machine的init函数
中被使用,init函数中会根据allnodes中的节点数据组合成platform_device数据结构,然后将其注册到platform总线上,下面简要分析一下并重点关注这些初始化过程中和
pm相关的初始化。
我参与的项目中machine的init函数就是via_init_machine函数,在这个函数中就是调用了of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL)这个函数来解析allnodes的。of_platform_populate是系统提供的接口。下面分析这个接口的实现:
[html] view plain
int of_platform_populate(struct device_node *root,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent)
{
struct device_node *child;
int rc = 0;
root = root ? of_node_get(root) : of_find_node_by_path("/");
if (!root)
return -EINVAL;
for_each_child_of_node(root, child) {
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}
of_node_put(root);
return rc;
}
root最后就是取到的根节点,然后其作为参数传递给of_platform_bus_create,of_platform_device_create_pdata的实现如下:
[html] view plain
static int of_platform_bus_create(struct device_node *bus,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent, bool strict)
{
const struct of_dev_auxdata *auxdata;
struct device_node *child;
struct platform_device *dev;
const char *bus_id = NULL;
void *platform_data = NULL;
int rc = 0;
/* Make sure it has a compatible property */
if (strict && (!of_get_property(bus, "compatible", NULL))) {
pr_debug("%s() - skipping %s, no compatible prop\n",
__func__, bus->full_name);
return 0;
}
auxdata = of_dev_lookup(lookup, bus);
if (auxdata) {
bus_id = auxdata->name;
platform_data = auxdata->platform_data;
}
if (of_device_is_compatible(bus, "arm,primecell")) {
of_amba_device_create(bus, bus_id, platform_data, parent);
return 0;
}
dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
if (!dev || !of_match_node(matches, bus))
return 0;
for_each_child_of_node(bus, child) {
pr_debug(" create child: %s\n", child->full_name);
rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
if (rc) {
of_node_put(child);
break;
}
}
return rc;
}
根据传入参数,我们这里直接分析of_platform_device_create_padate函数,如下:
[html] view plain
struct platform_device *of_platform_device_create_pdata(
struct device_node *np,
const char *bus_id,
void *platform_data,
struct device *parent)
{
struct platform_device *dev;
if (!of_device_is_available(np))
return NULL;
dev = of_device_alloc(np, bus_id, parent);
if (!dev)
return NULL;
#if defined(CONFIG_MICROBLAZE)
dev->archdata.dma_mask = 0xffffffffUL;
#endif
dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
dev->dev.bus = &platform_bus_type;
dev->dev.platform_data = platform_data;
/* We do not fill the DMA ops for platform devices by default.
* This is currently the responsibility of the platform code
* to do such, possibly using a device notifier
*/
if (of_device_add(dev) != 0) {
platform_device_put(dev);
return NULL;
}
return dev;
}
of_platform_device_create_padate->of_device_alloc->platform_device_alloc
便在platform_device_alloc函数中进行进行alloc和初始化了,实现如下:
[html] view plain
struct platform_device *platform_device_alloc(const char *name, int id)
{
struct platform_object *pa;
pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
if (pa) {
strcpy(pa->name, name);
pa->pdev.name = pa->name;
pa->pdev.id = id;
device_initialize(&pa->pdev.dev);
pa->pdev.dev.release = platform_device_release;
arch_setup_pdev_archdata(&pa->pdev);
}
return pa ? &pa->pdev : NULL;
}
可以看到有个device_initialize,这里面对pdev.dev做一些列的初始化,其中有一个函数就是device_pm_init,这个函数就是我们一直关心的device相关的pm函数,具体实现如下:
[html] view plain
void device_pm_init(struct device *dev)
{
dev->power.is_prepared = false;
dev->power.is_suspended = false;
init_completion(&dev->power.completion);
complete_all(&dev->power.completion);
dev->power.wakeup = NULL;
spin_lock_init(&dev->power.lock);
pm_runtime_init(dev);
INIT_LIST_HEAD(&dev->power.entry);
dev->power.power_state = PMSG_INVALID;
}
可以看见它对device和功耗相关的数据做了一些初始化,我们这里先重点关注下dev->power.entry,初始化一个链表头,所以他/它很有可能会在后面加到某个链表里面去,而那个链表应该是用来保存所有的device用的。系统中所有的platform_device都是通过这种方式注册到系统中的,那么应该所有的platform_device都会初始化一个dev->power.entry,如果到时候把所有的dev->power.entry都添加到某个链表上去,那么系统到时候查询的时候只要找到这个list head就可以找到所有的platform_device了。嗯,不过这是我们的猜测。我们接下去分析来验证下。
platform_device通过alloc之后已经初始化好了,那么接下去就可以添加到系统中了,所以我们再回头看of_platform_device_create_pdata的实现。
函数在of_device_alloc之后把dev->dev.bus赋值给了platform_bus_type,接着就调用了of_device_add函数,在of_device_add函数中最后通过device_add添加到了bus上,但是device_add中有个函数需要我们关系,就是device_pm_add(dev),实现如下:
[html] view plain
void device_pm_add(struct device *dev)
{
pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
mutex_lock(&dpm_list_mtx);
if (dev->parent && dev->parent->power.is_prepared)
dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent));
list_add_tail(&dev->power.entry, &dpm_list);
dev_pm_qos_constraints_init(dev);
mutex_unlock(&dpm_list_mtx);
}
可以看到这里list_add_tail(&dev->power.entry, &dpm_list);这就验证了我们之前的猜测。所有注册到系统中的设备,最终都是会添加到dpm_list这条链表上。
那么系统在休眠的时候是如何通过dmp_list这表链表来suspend设备的呢?接下去就是我们要分析的电源管理部分内容。
系统电源部分:
电源管理相关文件在kernel/power目录下,前面已经分析到。系统中注册的设备都是会添加到dmp_list这条链表上的。那么睡眠的时候系统应该是会查找dmp_list这条链表,
然后通过这条链表依次去查到对应的driver,然后调用driver中的suspend方法。下面我们来验证。
2.在suspend会轮询bus下的driver,然后一次调用到driver->pm->suspend方法,然后进入休眠。
3.state_store->pm_suspend->enter_state->suspend_devices_and_enter->dpm_suspend_start->dpm_suspend->device_suspend->__device_suspend->pm_op->(ops->suspend)
㈤ 在linux中,qsub投任务,我想问一下这两个状态:pending和suspend 有什么区别
通常情况下:
Pending是指任务在可以随时运行,但是因为已经有任务在运行,所以排队,这种状态的任务可随时进入运行态。
Suspend是被挂起的,在等待资源,等待的资源可以是输入、信号或者硬件设备,在得到想要的资源后会转成Pending状态(如果有任务在运行)。
㈥ 如何在Android 或Linux 下,做Suspend /Resume 的Debug
在Linux或Android下,做power management 的调适时,常遇到没有足够的information,可以做为debug时的依据和参考
我们整理了几个常用的参数或Command,可供设计者,得到足够的Informaiton 做Suspend / Resume的function Debug。
加boot 参数 no_console_suspend
基本上我们常常使用console做为suspend function的debug的Information source,但原始的source code在suspend过程中,会将console关掉。所以我们看到一定程度后就再也看不到message了。
但是我们并不知道在Suspend的过程中,系统到底发生了什么事,可能造成无法suspend。
为此,我们就会在kernel 启动参数中加上no_console_suspend这个参数。在AM/DM37x APM中是修改boot.scr档案参数
#!/bin/sh
cat <<EOF > boot.cmd
if fatload mmc 0 82000000 uImage
then
echo ***** Kernel: /dev/mmcblk0p1/uImage *****
fi
echo ***** RootFS: /dev/mmcblk0p2 *****
# Pantherboard DVI output
#setenv bootargs 'console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=dvi vram=32M omapfb.mode=dvi:1280x720MR-32 omapfb.vram=0:16M mpurate=1000'
# Pantherboard LCD output
setenv bootargs 'console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000'
将no_console_suspend加上去到boot 参数后就好了
setenv bootargs 'console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 no_console_suspend'
如果是OMAP4 APM的话,请修改Kernel 参数的所在档案即可(在U-boot Source code中)
这个是基本的参数,所以在Android或Linux上都可以使用。 kernel把console suspend掉以后, 不管里面出了什么事情, 在Console上都看不到。 而使用这个参数后,大部分在suspend/resume时候的死机都可以通过Console看到kernel Panic的信息, 这样我们才会知道是哪里出了问题。 因为有的时候resume出错, 或者suspend到很后面出错的console不加这个参数都看不到。
但这个参数在TI OMAP3/OMAP4/AM37x/DM37x有可能造成有时Suspend 完当掉或是resume 失败的问题,假如已经抓到问题在那的时候,您就可以将这个参数Disable,不然很可能就会Debug不下去。
initcall_debug
这个同样kernel参数,使用的时机是,当我们不知道是那个driver在suspend/resume过程中出错的时候,可以使用这个参数来找出问题所在。在下完这个参数后,Kernel在suspend时,会将每个driver或task的状况report出来。我们可以借由这些information,Check 在suspend时,每个task和driver是否已经完成进suspend 的相关准备工作…
打开这个参数的方法有二种
一种是在console下Command,启动这个function…
echo 1 > /sys/mole/kernel/parameters/initcall_debug
echo 9 > /proc/sys/kernel/printk
其中上面的第一条命令是打开initcall_debug, 这个是所有的kernel都会有的。
而第二条命令是要提高kernel message 级别,因为initcall的这些信息都是KERN_DEBUG级别的, 所以需要提高printk的级别才可以看到, 要不然suspend/resume的时候挂了,你就没有机会看到这些信息了。
另一种启动方法是写在kernel的启动参数下,就可以了。
setenv bootargs 'console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 initcall_debug no_console_suspend'
同样的,这个参数也有可能造成AM37x/DM37x/OMAP4 APM发生进suspend当掉的问题。所以一旦知道问题所在,麻烦请将这个参数Disable掉。
suspend_test
这个方法可以用rtc这种软件的方式来做循环的suspend/resume, 尽管对于Android这样并不是很足够, (还要再模拟一个POWER_KEY上去才够), 但是对于测试Driver的稳定性, 还是有一定用处的。不要认为suspend了几次可以,那么就可以通过几千次的测试。这个suspend是5秒钟用RTC唤醒,然后回到Android后5秒钟又会自动睡下去,但是对于通用Linux,你可以写个script来让他起来一会再睡下去,或许这个工具比较有用rtcwakeup(google rtcwakeup)。
使用方法:
编译一个有这个功能的kernel, make menuconfig 以后选上
CONFIG_PM_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y
这两个选项,烧写新的kernel,然后打开你需要测试的Device, 比如WIFI,3G
echo "core" > /sys/power/pm_test
echo "mem" > /sys/power/state
这样, 它就会循环休眠和唤醒了。
wakelock
Android和Linux在Power Management相关的最大的就是wakelock机制的有无。Android有时候会碰到suspend进不去,或者suspend到最后又莫名奇妙的wake up的问题。这些都有可能是wakelock引起的,或者说是wakelock的使用者引起的。怎么fine tune呢,使用Console在Android 系统下设定:
echo 15 > /sys/mole/wakelock/parameters/debug_mask
echo 15 > /sys/mole/userwakelock/parameters/debug_mask
15是代表16进制的F, 在wakelock里面就是把所有的debug信息打开, 起码现在是这样设定的。如果以后不够用了,可能就会改成255.
这样你能看到kernel和frameworks层对于wakelock的操作、申请及释放。这样看申请和释放成对否就可以了。
注意: wakelock有一种是timeout的,就是说多少毫秒以后,会自动释放,对于这些wakelock,申请和释放可能是不成对的。
power.0
有时看到系统suspend到了最后, 然后遇到power.0后suspend失败,然后整个系统又resume回来。这个是android专有的,因为power.0是android注册到suspend最后的一个行程, 它会在CPU进入suspend之前检查一下有没有wakelock存在, 如果这时候还有没有释放的wakelock, 那么它会return -EBUSY然后导致整个suspend失败。 Check这个问题的方法就是把上面wakelock的debug信息打开,然后看看是哪个去申请了wakelock,然后Release它。
这个错误的错误信息大概是这样的:
pm_noirq_op(): platform_pm_suspend_noirq+0x0/0x38 returns -11
PM: Device power.0 failed to suspend late: error -11
earlysuspend
在android里面中另外一个和Power Management有相关的机制叫earlysuspend, 同样可以打开debug message,用来做Android earlysuspend debug之用:
echo 15 > /sys/mole/earlysuspend/parameters/debug_mask
来把相关的debug信息印出来, 例如那个earlysuspend要被call之类的。
suspend/resume 时间 fine tune
有的时候你要调试suspend/resume的时间太慢的问题。 一种方法是用initcall_debug, 然后把printk的时间戳打上, 然后看那个process最慢,再来Check原因是什么
我有一个patch,专门用来调试这个问题的,但是upstream不接受, 说非要用这种折磨人的方法才行, 但是如果你想用可以下下来打上去用一下。
地址在这里:http://www.spinics.net/lists/linux-pm/msg24063.html
用法是, 打上这个PATCH以后, 在KERNEL里面选择上PM_DEBUG, SUSPEND_DEVICE_TIME_DEBUG 这两个选项。
然后
echo 微秒> /sys/power/device_suspend_time_threshold
比如
echo 50000 > /sys/power/device_suspend_time_threshold
注意这里是微秒哦。 。 。 它会把在suspend/resume的时候慢的那些driver打出来,然后你去干掉它。 。
㈦ Linux里面杀掉进程命令是什么
方法一: Terminal终端输入: gnome-system-monitor,就可以打开system monitor
如图:
然后找到相应进程,右击选择kill process就可以了
方法二: 通过kill 进程id的方式可以实现,
首先需要知道进程id, 例如,想要杀死firefox的进程,通过 ps -ef|grep firefox,可以查到firefox的进程id:
然后通过 kill 3781 就可以关闭进程了.
补充: 1. kill -9 来强制终止退出, 例如: kill -9 3781
2.特殊用法:
kill -STOP [pid]
发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
kill -CONT [pid]
发送SIGCONT (19,18,25)重新开始一个停止的进程。
kill -KILL [pid]
发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
kill -9 -1
终止你拥有的全部进程。
方法三: killall 通过程序的名字,来杀死进程
例如: killall firefox
注意: 该命令可以使用 -9 参数来强制杀死进程, killall -9 firefox
方法四: pkill 通过程序的名字, 直接杀死所有进程
例如: pkill firefox
方法五: 通过xkill 可以杀死图形程序应用, 例如firefox崩溃无响应,可以使用该命令.
例如: 用法xkill , 会出现一个白色的x, 然后用鼠标单击想要杀死的应用,如图
以下内容引用自: http://justcoding.iteye.com/blog/1931347
◆编者注:
KILLALL(Section: User (1)/Updated: 1999年9月7日)
———————————————–
NAME (名称)
killall – 以名字方式来杀死进程
SYNOPSIS (总览)
killall [-egiqvw] [-signal] name …
killall -l
killall -V
DESCRIPTION (描述)
killall 发送一条信号给所有运行任意指定命令的进程. 如果没有指定信号名, 则发送SIGTERM.。
信号可以以名字 (如 -HUP ) 或者数字 (如 -1 ) 的方式指定. 信号 0 (检查进程是否存在)只能以数字方式指定。
如果命令名包括斜杠 (/), 那么执行该特定文件的进程将被杀掉, 这与进程名无关。
如果对于所列命令无进程可杀, 那么 killall 会返回非零值. 如果对于每条命令至少杀死了一个进程, killall 返回 0。Killall 进程决不会杀死自己 (但是可以杀死其它 killall 进程)。
OPTIONS (选项)
-e
对 于很长的名字, 要求准确匹配. 如果一个命令名长于 15 个字符, 则可能不能用整个名字 (溢出了). 在这种情况下, killall 会杀死所有匹配名字前 15 个字符的所有进程. 有了 -e 选项,这样的记录将忽略. 如果同时指定了 -v 选项, killall 会针对每个忽略的记录打印一条消息。
-g
杀死属于该进程组的进程. kill 信号给每个组只发送一次, 即使同一进程组中包含多个进程。
-i
交互方式,在杀死进程之前征求确认信息。
-l
列出所有已知的信号名。
-q
如果没有进程杀死, 不会提出抱怨。
-v
报告信号是否成功发送。
-V
显示版本信息。
-w
等待所有杀的进程死去. killall 会每秒检查一次是否任何被杀的进程仍然存在, 仅当都死光后才返回. 注意: 如果信号被忽略或没有起作用, 或者进程停留在僵尸状态, killall 可能会永久等待。
FILES(相关文件)
/proc proc文件系统的存在位置。
KNOWN bugS (已知 BUGS)
以文件方式杀死只对那些在执行时一直打开的可执行文件起作用, 也即, 混杂的可执行文件不能够通过这种方式杀死。
要警告的是输入 killall name 可能不会在非 Linux 系统上产生预期的效果, 特别是特权用户执行时要小心。
在两次扫描的间隙, 如果进程消失了而被代之以一个有同样 PID 的新进程, killall -w 侦测不到。
来源:http://www.ubuntuhome.com/ubuntu-kill-command.html
下面来了解相关命令:
一、查看进程的命令 有ps、pstree、pgrep等:
1、ps
显示进程信息,参数可省略
-aux 以BSD风格显示进程 常用
-efH 以System V风格显示进程
-e , -A 显示所有进程
a 显示终端上所有用户的进程
x 显示无终端进程
u 显示详细信息
f 树状显示
w 完整显示信息
l 显示长列表
在终端中执行ps aux,
各列输出字段的含义:
USER 进程所有者
PID 进程ID
PPID 父进程
%CPU CPU占用率
%MEM 内存占用率
NI 进程优先级。数值越大,占用CPU时间越少
VSZ 进程虚拟大小
RSS 页面文件占用
TTY 终端ID
STAT 进程状态
+---D 不可中断 Uninterruptible sleep (usually IO)
+---R 正在运行,或在队列中的进程
+---S 处于休眠状态
+---T 停止或被追踪
+---Z 僵尸进程
+---W 进入内存交换(从内核2.6开始无效)
+---X 死掉的进程
+---< 高优先级
+---N 低优先级
+---L 有些页被锁进内存
+---s 包含子进程
+---+ 位于后台的进程组;
+---l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
PID:进程标识符,系统为每一个进程分配一个识别码,称为PID。
ps命令极为常用,其他命令还有:
2.pstree
树状显示进程信息
-a 显示完整命令及参数
-c 重复进程分别显示
-c 显示进程ID PID
-n 按 PID 排列进程
3.pgrep <进程名>
显示进程的PID
-l 显示进程名和进程PID
-o 进程起始ID
-n 进程终止ID
二、结束进程的命令 有kill、pkill、killall、xkill等:
kill [信号代码] <进程PID>
根据PID向进程发送信号,常用来结束进程,默认信号为 -9
信号代码,可取值如下:
-l [信号数字] 显示、翻译信号代码
-9 , -KILL 发送 kill 信号退出
-6 , -ABRT 发送 abort 信号退出
-15 , -TERM 发送 Termination 信号
-1 , -HUP 挂起
-2 , -INT 从键盘中断,相当于 Ctrl+c
-3 , -QUIT 从键盘退出,相当于 Ctrl+d
-4 , -ILL 非法指令
-11 , -SEGV 内存错误
-13 , -PIPE 破坏管道
-14 , -ALRM
-STOP 停止进程,但不结束
-CONT 继续运行已停止的进程
-9 -1 结束当前用户的所有进程
pkill <进程名>
结束进程族。如果结束单个进程,请用 kill
killall <进程名>
killall和pkill 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
xkill
在图形界面中点杀进程。
当xkill运行时鼠标指针变为骷髅图案,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消。
比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。
xkill 调用方法:
[root@localhost ~]# xkill
来源: http://www.cnblogs.com/1024-wusuopuBUPT/archive/2012/02/16/2354132.html
linux中pkill的简单用法
pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
必要参数
-f 显示完整程序
-l 显示源代码
-n 显示新程序
-o 显示旧程序
-v 与条件不符合的程序
-x 与条件符合的程序
选择参数
-p<进程号> 列出父进程为用户指定进程的进程信息
-t<终端> 指定终端下的所有程序
-u<用户> 指定用户的程序
应用方法:
#pkill 正在运行的程序名
举例:
Java代码
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim
也就是说:
kill 对应的是 PID
pkill 对应的是COMMAND
例如在Ubuntu中强制结束一个已成僵尸的名称为:firefox,PID为:1603的进程,可以如下操作:
方法一:
(1)ctrl+alt+t,调出终端,输入 top,然后就可以看到现在系统的进程,是按占用资源从多到少排列的。
找到要关掉的进程,记下该进程第一列的数字编号(假设是xx),然后输入q,退回终端。
(2)输入:sudo kill xx(对应刚才的编号)。
方法二:
ctrl+alt+t,调出终端,输入:sudo pkill firefox
范例1: 杀死指定进程
Java代码
root@snail-hnlinux:~# ps -A //显示所有进程
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
……忽略部分
28382 ? 00:00:00 gvfsd-http
28391 ? 00:07:07 software-center
30467 ? 00:00:31 designer-qt4
30487 ? 00:00:06 gnome-terminal
30488 ? 00:00:00 gnome-pty-helpe
30489 pts/0 00:00:00 bash
30670 ? 00:00:00 debconf-communi
30749 pts/0 00:00:17 gedit
31155 ? 00:00:00 dhclient
31325 ? 00:00:01 sshd
31327 ? 00:00:00 sshd
31400 pts/1 00:00:00 bash
31485 pts/2 00:00:00 bash
3 ? 00:00:00 aptd
31658 pts/1 00:00:00 ps
root@snail-hnlinux:~# pidof sshd //查看与sshd相关进程
31327 31325 2095
root@snail-hnlinux:~# pkill -9 sshd //杀死指定进程
范例2:杀死同义终端下的进程
Java代码
root@snail-hnlinux:~# pkill -t tty1 //杀死终端1下的所有进程
范例3: 杀死指定用户进程
Java代码
root@snail-hnlinux:~# pkill -u hnlinux
范例4:反向选择
Java代码
root@snail-hnlinux:~# pkill -vu hnlinux //杀死不属于hnlinux用户的所有进程
————————————————
版权声明:本文为CSDN博主“MrCoderr”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/coderder/article/details/78899823
㈧ Linux 暂停命令
linux的暂停命令就是将进程杀死。
用一个实例说明:
1、首先使用tar命令打包/usr目录:
进程恢复运行状态(R)
㈨ Linux 暂停命令
是让你指定内核头文件。
要想停止安装,可以用CTRL+ALT+F3这三个组合键,切换到另一个虚拟终端,ps
aux|grep
"configure"
命令找出这个进程号,然后kill
-9
这个进程号就可以杀死这个进程了。
个人建议用VirtualBox虚拟机,开源软件,比VMWARE简单易用。
㈩ linux下如何暂停一个进程
kill -STOP 1234 将该进程暂停。
如果要让它恢复到后台,用kill -CONT 1234 (很多在前台运行的程序这样是不行的)
如果要恢复到前台,请在当时运行该进程的那个终端用
jobs命令查询暂停的进程。
然后用 fg 〔job号〕把进程恢复到前台。
如果jobs只查询到一个进程,只用 fg 即可。
例:
root@dWorks:~# bc -q
[1]+ Stopped bc -q
root@dWorks:~# bc -q
[2]+ Stopped bc -q
root@dWorks:~# jobs
[1]- Stopped bc -q
[2]+ Stopped bc -q
root@dWorks:~# fg 2
bc -q
1+1
2