Mac:从 launchctl 运行屏幕命令

Mac:从 launchctl 运行屏幕命令

我有一个 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。然后只需转到系统偏好设置->用户和帐户->登录项,单击+并添加文件。

参考:

  1. https://askubuntu.com/a/983176/667707
  2. https://superuser.com/a/307486/691289
  3. https://superuser.com/a/995564/691289

相关内容