Shell编程实战:远程杀僵进程与删除空链接解决方案

4星 · 超过85%的资源 需积分: 50 11 下载量 113 浏览量 更新于2024-09-17 1 收藏 40KB DOC 举报
"shell编程实例集锦包含了两个实用的shell脚本示例,分别是用于远程杀死僵进程的`rkill`脚本和删除index文件中空链接的脚本。这两个实例展示了shell脚本在系统管理和文件操作中的强大功能。" 在IT领域,shell编程是一种非常重要的技能,尤其对于系统管理员和自动化任务的执行者来说。这里有两个具体的shell脚本实例,我们可以详细分析它们的工作原理和用途。 ### 远程杀死僵进程的`rkill`脚本 这个脚本主要用于处理并行计算时可能产生的僵进程。僵进程是指那些已经进入睡眠状态但不再有用或无法正常结束的进程。`rkill`脚本通过以下步骤来实现远程杀死指定范围内的节点上的指定程序进程: 1. 用户输入起始节点号 (`N1`)、结束节点号 (`N2`) 和要杀掉的程序名称 (`pname`)。 2. 脚本使用`rsh`(远程 shell)命令连接到每个指定的节点,并运行`ps -ef`命令来列出所有进程。 3. 使用`awk`命令从`ps -ef`的输出中提取出对应程序的进程ID (`ppid`)。 4. 再次使用`rsh`命令在每个节点上执行`kill`命令,以终止找到的进程ID。 ### 删除index文件中空链接的脚本 此脚本用于清理一个HTML索引文件(如`archivepix.html`)中的无效链接,确保链接指向的文件实际存在。以下是脚本的主要步骤: 1. 首先,它使用`find`命令在当前目录下查找所有的实际文件,但不包括子目录,并且匹配特定的文件名格式(在这种情况下是`ap[0-9][0-9][0-9][0-9][0-9][0-9].html`)。 2. `find`命令的输出会被处理,将路径部分(`./`)移除,只保留文件名部分。 3. 然后,脚本将这些文件名与`archivepix.html`文件中的链接进行对比,通过`sed`命令进行文本替换,以便比较。 4. 最终,未在实际文件列表中存在的链接将被识别并删除。 这两个shell脚本实例展示了shell编程的灵活性和实用性,它允许用户自定义系统级别的任务,自动化日常维护工作,提高效率。通过学习和理解这些实例,可以提升在系统管理、故障排查和自动化流程设计方面的能力。在实际工作中,shell脚本可以广泛应用于日志分析、文件处理、定时任务以及监控等场景。
2018-09-23 上传
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).