OSX系统启动与后台服务

  1. OSX启动过程
    1. mac固件激活,初始化硬件,加载BootX引导器。
    2. BootX加载内核与内核扩展(kext)。
    3. 内核启动launchd(init)进程。
  2. launchd进程
    1. 开机后先加载system wide daemon;加载完成后显示登录窗口;
    2. 登录后加载per user agents;
    3. 用户启动的所有的进程实际也是有launchd加载的!!!
  3. Launch Daemon与Launch Agent
    1. 两者都是后台服务,前者是系统级的;后者是用户级的;
    2. 前者在开机时会启动,类似windows的service;而后者必须要用户登录后才会启动;
    3. Launch Daemon/Agent都是有plist文件定义的,文件是xml格式;
    4. Daemon目录:
      1. /System/Library/LaunchDaemons
      2. /Library/LaunchDaemons
    5. OSX在开机时的操作:
      1. 注册在上述目录中的plist内的port和file descriptor
      2. 执行keepAlive=true以及RunAtLoad=true的Deamon
    6. 执行完deeon之后才会显示登录对话框
    7. 登录之后执行Launch Agents
    8. Agents目录:
      1. /System/Library/LaunchAgents
      2. /Library/LaunchAgents
      3. ~/Library/LaunchAgents
    9. 其它同Deamon
    10. 附图一张,测试一下修复之后的上传功能是否正常。 
    11. 2015122210312780909335
  4. Daemon的其它知识
    1. on-daemon:
      1. 相对于keepAlive而言,它允许被杀掉;而keepalive的daemon一旦被杀,launchd又会启动;
      2. on-daemon可以绑定端口,一旦收到发送到某个端口的包,自动启动某个进程;或其它依赖的情形也有可能导致daemon被启动;
    2. 允许定时daemon
    3. 允许监视某个文件或目录
  5. LoginItem
    1. 这个相当于Windows的“启动”开始菜单;
    2. 对于使用沙盒方式运行的程序,应当使用Service Management Framework方式加载。
      1. 要求必须有两个应用,一个是主应用一个是Helper;其中Helper不是沙盒应用;
      2. helper程序存放在主程序的Contents/Library/LoginItems目录下
      3. 主程序在运行时调用SMLoginItemSetEnabled()函数来设置helper程序为自启动程序。
    3. 主程序必须在Application的目录下,开机启动的设置才会生效,否则会失败
  6. StartupItem
    1. 此方法已不推荐
    2. 它从性质上像LoginItem,但不要求必须登录,又类似于Deamon。
  7. 优秀文章:
    1. MAC服务管理(launchd)
    2. OS X那些事—恶意软件是如何启动的
Continue Reading

Convert2PDF on MAC

打印投标文档前一般需要转换为PDF:)投标文档含封面之类的有几个到上十个Word文档,一个个打开转换稍显麻烦,弄了一个脚本来做这个事情。

property
theList : {"doc", "docx"}

on run {input, parameters}
set output to {}
tell application "Microsoft Word" to set theOldDefaultPath to get default file path file path type documents path
repeat with x in input
try
set theDoc to contents of x
tell application "Finder"
set theFilePath to container of theDoc as text

set ext to name extension of theDoc
if ext is in theList then
set theName to name of theDoc
copy length of theName to l
copy length of ext to exl

set n to l - exl - 1
copy characters 1 through n of theName as string to theFilename

set theFilename to theFilename & ".pdf"

tell application "Microsoft Word"
set default file path file path type documents path path theFilePath
open theDoc
set theActiveDoc to the active document
save as theActiveDoc file format format PDF file name theFilename
copy (POSIX path of (theFilePath & theFilename as string)) to end of output
close theActiveDoc without saving
end tell
end if
end tell
end try
end repeat
tell application "Microsoft Word" to set default file path file path type documents path path theOldDefaultPath

return output
end run

上面的代码是从网上弄来的,来源在这里:

Convert Word to PDF – Mac OS X

我做了一点点修改,原文中关闭文档的代码是:

close theActiveDoc

修改为:

close theActiveDoc without saving

这样一来就不会跑出一个让你保存代码的对话框转换后也不会保留很多打开的文件了。

文章里没写如何安装为Finder的Service(相当于Windows Explorer的右键菜单),反而是写的用Automator来操作。用Service的方法很简单:
1. 打开Automator,新建一个Service,选择Select Files or Folder in Finder。

2. 新增一个Action,类型选择Run AppleScript,将上面的代码完整的复制进去。(删除里面的默认的框架代码,只保留本文的代码)

3. 保存,取一个名字,比如:Convert2PDF。
4. 在Finder中选择所有待转换的doc/docx文件,右键选择service,菜单里就会有Convert2Pdf的选项了。然后静待一切完工吧

Continue Reading