我有一个 Python 脚本,我想在 Mac 系统启动时在独立的屏幕会话中运行它。
Python 文件(foo.py
):
import time
import datetime
while True:
print 'hello', datetime.datetime.now()
time.sleep(2)
调用它的 Shell 脚本(run_foo.sh
):
#!/bin/bash
username=`whoami`
_python=`which python`
screen -dm -S run_foo $_python /Users/$username/foo.py
调用Shell脚本的Plist: https://gist.github.com/cooncesean/6617008
===========
Python 脚本可以自行正常运行:
> python foo.py
hello 2013-09-18 21:20:22.132170
hello 2013-09-18 21:20:24.133420
hello 2013-09-18 21:20:26.134697
...
调用Python脚本的Shell脚本本身运行良好:
> sh run_foo.sh
There is a screen on:
1922.run_foo (Detached)
1 Socket in /var/folders/4z/0413fcs523l8nz12xbvng0bh0000gn/T/.screen.
> screen -r run_foo
hello 2013-09-18 21:24:57.243103
hello 2013-09-18 21:24:59.244349
加载 plist(调用 shell 脚本,创建屏幕并运行 Python 脚本)会导致我出现需要清除的死屏会话。
> launchctl load ~/Library/LaunchAgents/start-foo.plist
> screen -list
There is a screen on:
1951.run_foo (Dead ???)
Remove dead screens with 'screen -wipe'.
1 Socket in /var/folders/4z/0413fcs523l8nz12xbvng0bh0000gn/T/.screen.
更新:它似乎 launchd 不允许您调用守护进程(在本例中为screen
)并引发异常。那么,如何在 Mac 上启动时启动屏幕会话?crontab?
答案1
通过拼凑几个不同的答案[1][2][3],我能够解决这个问题。
我编写了一个脚本来启动我的屏幕命令,如下所示:
#!/usr/bin/env bash
screen -dmS MySessionName $SHELL
screen -S MySessionName -p 0 -X stuff "myprogram"$'\n'
然后将其保存为.sh
文件并运行chmod a+x
。在 Finder 中,我曾经Cmd-I
将 Terminal.app 设置为打开类型文件的默认方式.sh
。然后只需转到系统偏好设置->用户和帐户->登录项,单击+
并添加文件。
参考: