我在 EC2 實體中運行一些行程。
要運行它,我使用 SSM 命令啟動它:
cd / && cd home/ec2-user && . .nvm/nvm.sh && cd ufo && npm run start
在其中,我有一個方法,app.ts其中初始化為ts-node app.ts
import { execSync } from 'node:child_process';
import { takeNextScheduledAudit } from './sqs-scheduler';
import { uploadResultsToBucket } from './s3-uploader';
import { AuditRunParams } from "./types";
import { sendAuditResults } from "./sendResults";
(async function conductor(): Promise<void> {
const nextAuditRunParams = await takeNextScheduledAudit();
if (!nextAuditRunParams) {
execSync("sudo shutdown -h now");
}
const { targetUrl, requesterId, endpoint } = nextAuditRunParams as AuditRunParams;
try {
execSync(`npx user-flow --url=${targetUrl} --open=false`);
const resultsUrl = await uploadResultsToBucket(targetUrl);
await sendAuditResults(requesterId, endpoint, resultsUrl);
} catch (error) {
console.log(error);
}
await conductor();
})();
如果我手動登錄并運行npm run start腳本按預期作業,但如果我使用 SSM 命令運行它,我會得到以下輸出:
> start
> ts-node app.ts
Error: Command failed: npx user-flow --url=https://deep-blue.io/ --open=false
at checkExecSyncError (node:child_process:841:11)
at execSync (node:child_process:912:15)
at conductor (/home/ec2-user/ufo/app.ts:15:17)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
status: 243,
signal: null,
output: [ null, <Buffer >, <Buffer 0a> ],
pid: 2691,
stdout: <Buffer >,
stderr: <Buffer 0a>
}
這個錯誤:
Error: Command failed: sudo shutdown -h now
at checkExecSyncError (node:child_process:841:11)
at execSync (node:child_process:912:15)
at conductor (/home/ec2-user/ufo/app.ts:10:17)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async conductor (/home/ec2-user/ufo/app.ts:21:5) {
status: null,
signal: 'SIGTERM',
output: [ null, Buffer(0) [Uint8Array] [], Buffer(0) [Uint8Array] [] ],
pid: 2705,
stdout: Buffer(0) [Uint8Array] [],
stderr: Buffer(0) [Uint8Array] []
}
failed to run commands: exit status 1
此外,如果我運行execSync("node -v && npx -v")它也會引發錯誤。
為什么我可以在登錄時運行此腳本,但如果我通過 SSM 命令運行它,它無法識別節點內的節點?
--- 編輯 - 添加資訊 ---
運行execSync(node -v && npx -v時,{shell: '/bin/bash'})出現錯誤:
Error: Command failed: node -v && npx -v
運行execSync(ps -p $$ && echo $SHELL時, {shell: '/bin/bash'}):
PID TTY TIME CMD
7817 ? 00:00:00 bash
/bin/bash
當我登錄并ps -p $$ && echo $SHELL得到:
PID TTY TIME CMD
6873 pts/0 00:00:00 bash
/bin/bash
uj5u.com熱心網友回復:
默認情況下,所有child_process函式都在與啟動它們的行程相同的環境中執行。我沒有方便測驗的帳戶,但 SSM 很可能會跳過傳統的 shell 并直接執行某些運行時。
您可以使用這樣的 exec 選項來設定啟動行程的特定 shell:
const output = execSync('echo "doing stuff"', {
shell: '/bin/bash',
})
console.log('***** output:', output.toString())
這是假設您用于 EC2 實體的作業系統具有可用的 bash。大多數版本的 linux 都應該,但是對于你在那里所做的事情,/bin/sh如果沒有就足夠了。要獲取可用 shell 的串列,您可以運行:
cat /etc/shells
## or possibly
sudo cat /etc/shells
編輯:既然你說它已經在 shell 中作業正常,你可能已經處理了這個,但user-flow也必須可用。它不是來自 的模塊npmjs,因此需要已經作為本地依賴項或 EC2 實體可以訪問的私有存盤庫出現在盒子上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529972.html
下一篇:在Kivy中每秒顯示一個亂數
