O Launchd não dá ao apache (XAMPP) todos os privilégios na inicialização

0

Eu uso o Mac OS X e uso o Launchd para iniciar automaticamente o XAMPP. Eu configurei o conjunto de usuários do apache para ser o mesmo que o nome da minha conta no httpd.conf

User cwd
Group nogroup

Bem, se eu deixar o computador inicializar, e se eu executar um script php com esses comandos, aqui está o que eu recebo:

echo exec('whoami'); //cwd
exec('echo 1234 | pbcopy');
echo exec('pbpaste'); // (nothing)

No entanto, se eu parar o XAMPP e reiniciá-lo (usando o controle XAMPP), ele funcionará como esperado e o resultado da terceira linha será 1234.

echo exec('pbpaste'); // 1234

Eu também tenho experiências semelhantes com a execução de outros comandos do sistema com exec ou shell_exec like ssh . Eles não parecem funcionar até que eu reinicie o apache manualmente. Alguém tem algum pensamento sobre isso?

Aqui está o meu arquivo de configuração de lançamento:

/Library/LaunchDaemons/xampp.sql.startapache.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnableTransactions</key>
<true/>
<key>Label</key>
<string>xampp.startapache.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/XAMPP/xamppfiles/xampp</string>
<string>startmysql</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Applications/XAMPP/xamppfiles</string>
<key>KeepAlive</key>
<false/>
<key>AbandonProcessGroup</key>
<true/>
</dict>
</plist>
    
por cwd 28.03.2011 / 16:12

1 resposta

2

Não é uma coisa de privilégio, é porque o pbcopy e o pbpaste precisam de um servidor de pasteboard (essencialmente, um programa em segundo plano que armazena o pasteboard) e que é executado como parte de uma sessão de login do usuário. O launchd executa o apache em um contexto do sistema, portanto não há nenhum servidor de quadro de distribuição disponível (observe que, embora o apache troque os usuários para o cwd, isso não é o mesmo que ingressar na sua sessão de login).

Pode haver uma maneira de participar de uma sessão de login específica (envolvendo launchctl bsexec ), mas para um serviço da Web isso seria uma má ideia. Primeiro, porque não seria possível ingressar até que você efetuasse login e quebraria assim que você efetuasse o logout; o serviço da web deve ser executado independentemente de quem estiver logado no momento. Segundo, porque isso significaria que seus scripts php compartilham um pasteboard com sua sessão de usuário - você iria copiar algo de um programa para outro e descobrir que estava colando algo do script da Web, não o que você copiou . E a mesma coisa poderia acontecer com o script - ele copia algo, e então recupera algo completamente diferente porque você usou a cópia da GUI. E se várias cópias do roteiro estivessem sendo executadas, elas poderiam pisar umas nas outras ... seria uma bagunça completa. Não tenho certeza do que você está tentando realizar com o pbcopy e o pbpaste, mas tenho certeza de que essa é a maneira errada de fazer isso.

    
por 28.03.2011 / 17:39