Con quale utente si avvia pm2 e quali permessi utilizza?

Risoluzione dei Problemi di Permessi su Cartelle e Processi PM2 in Linux

Quando si utilizzano applicazioni Node.js gestite da PM2, su macchine in cui accedono più utenti, è possibile imbattersi, come è capitato a me, in problemi di permessi su file e cartelle. In particolare, può accadere che un processo avviato da un utente non riesca a scrivere su una directory, nonostante l’utente appartenga apparentemente al gruppo corretto.

A volte aggiungi un utente a un gruppo, imposti i permessi corretti sulle cartelle… ma l’app continua a dare EACCES: permission denied. Perché? Perché PM2 (o il processo che lancia) non ha aggiornato i gruppi effettivi.

In questo articolo vediamo come diagnosticare questi problemi in modo chiaro usando una semplice app Node.js e quando è necessario riavviare PM2 o l’intero sistema.

Il Cuore del Problema

Aggiungi l’utente a un gruppo ➡️ Ma non basta

  • Il kernel non aggiorna i gruppi effettivi di un processo già in esecuzione.
  • PM2 eredita i gruppi al momento del lancio, e li mantiene finché il processo non viene riavviato.
  • A volte, solo un riavvio della macchina garantisce la ripartenza pulita di tutti i processi, specie se PM2 parte come servizio systemd.

L’Applicazione di Test dei Permessi

Creiamo una piccola app Node.js che:

  • Mostra l’utente attuale e i suoi gruppi
  • Controlla i permessi su una directory
  • Prova a scrivere un file di test

Sorgente applicazione di test

const os = require('os');
const fs = require('fs');
const util = require('util');
const exec = util.promisify(require('child_process').exec);

const targetFolder = '/percorso/della/cartella'; // <-- personalizza qui!
const testFile = `${targetFolder}/testfile.txt`;

(async () => {
console.log('=============================');
console.log('🧑‍💻 User & Group Info');
console.log('=============================');
console.log(`User: ${os.userInfo().username}`);
console.log(`UID : ${process.getuid()}`);
console.log(`GID : ${process.getgid()}`);

const { stdout: groups } = await exec('id');
console.log(`Groups: ${groups.trim()}`);

console.log('\n=============================');
console.log('📁 Folder Permissions');
console.log('=============================');
const folderStats = fs.statSync(targetFolder);
console.log(`Path : ${targetFolder}`);
console.log(`Owner UID : ${folderStats.uid}`);
console.log(`Owner GID : ${folderStats.gid}`);
console.log(`Permissions : ${folderStats.mode.toString(8)}`);

console.log('\n=============================');
console.log('📝 Test Write Access');
console.log('=============================');
try {
fs.writeFileSync(testFile, `Test scritto da ${os.userInfo().username} - ${new Date().toISOString()}\n`, { flag: 'a' });
console.log(`✅ Scrittura su ${testFile} OK`);
} catch (err) {
console.error(`❌ Non riesco a scrivere su ${testFile}`);
console.error(err.message);
}

console.log('\nFINE TEST');
})();

Salva questo test file (ad esempio index.js) su una cartella dalla quale puoi lanciare i seguenti comandi:

pm2 start index.js --name testpm2perm
pm2 logs testpm2perm

Io l’ho chiamata testpm2perm, tu fai come ti pare.

Con questo software riuscite a capire se ci sono dei path che vi sono preclusi e, soprattutto, con quale utente gira pm2.

Pertanto, potreste avere dei permessi insufficienti per manipolare i files di una cartella se lanciate il programma con pm2.

Una volta reimpostati i permessi e i gruppi degli utenti, in particolare all’utente che è dietro pm2, tali da consentirgli la manipolazione dei file, potreste essere costretti a riavviare il sistema, prima di riuscire a vedere il bug risolto e il vostro software funzionare.

Quando è Necessario il Reboot?

  • PM2 viene gestito da systemd e i processi non vengono aggiornati correttamente
  • Il gruppo è stato aggiunto, ma il processo parte troppo presto durante il boot
  • I processi sono zombie di vecchie sessioni non aggiornate

Lo script esposto in questo articolo è stato scritto con intelligenza artificiale e mi ha aiutato a risolvere una problematica reale.
Questo articolo è solo una scusa per appuntarmi questa soluzione e, perché no, renderla disponibile agli altri.

Eseguire uno script PHP da riga di comando con parametri: ecco come fare

Se sei abituato a usare PHP solo all’interno di pagine web, potresti non sapere che puoi eseguire script PHP direttamente dalla riga di comando. Questo ti permette di automatizzare processi, scrivere script di manutenzione e interagire con il sistema senza bisogno di un server web.

Come eseguire uno script PHP da CLI con parametri

Per lanciare uno script PHP da terminale, usa il comando:

php -f nome_script.php parametro1 parametro2 ...

Ad esempio, supponiamo di avere un file test.php con il seguente codice:

<?php
$nome = $argv[1]; // Il primo parametro passato da CLI
echo "Ciao $nome, benvenuto a bordo!";

Possiamo eseguirlo direttamente dal terminale con:

php -f test.php Ciccio

Il risultato sarà:

Ciao Ciccio, benvenuto a bordo!

Guarda anche questa discussione su Stack Overflow:
Run PHP script from command line with variable

A Comprehensive Guide to Amazon S3 Buckets

Amazon Simple Storage Service (S3) is a scalable and secure object storage service widely used for storing and retrieving data in the cloud. Unlike a traditional file system, S3 organizes data into “buckets” and manages objects within them. This article explores the key aspects of S3, how it differs from a standard file system, and how to interact with it from the command line.


What Is an S3 Bucket?

An S3 bucket is a high-level container that stores objects (files) and their metadata. Each bucket is unique within an AWS account and provides a globally unique namespace. S3 offers high availability, durability, and security through fine-grained IAM (Identity and Access Management) policies.

Differences Between S3 and a Traditional File System

FeatureS3 BucketTraditional File System
Storage StructureFlat namespace with object keysHierarchical directory structure
AccessibilityCloud-based, accessed via APIsLocal or network-based access
MetadataExtensive, including custom tagsLimited to standard file attributes
ScalingVirtually unlimited storageLimited by disk space
PermissionsManaged via IAM roles and bucket policiesManaged via OS file permissions

Connecting to an S3 Bucket via Console

To interact with S3 from the command line, you need the AWS CLI installed and configured. The configuration file is stored in ~/.aws/.

Setting Up AWS Credentials

  1. Install the AWS CLI: sudo apt install awscli # Ubuntu brew install awscli # macOS
  2. Configure AWS credentials: aws configure You’ll be prompted to enter:
    • AWS Access Key ID
    • AWS Secret Access Key
    • Default region
    • Default output format (json, table, text)
  3. The credentials are stored in ~/.aws/credentials: [default] aws_access_key_id=YOUR_ACCESS_KEY aws_secret_access_key=YOUR_SECRET_KEY
  4. IAM Role Considerations: If using an IAM role on an EC2 instance, attach the role with the necessary S3 permissions, and the CLI will automatically retrieve credentials.

Basic S3 Operations Using AWS CLI

Listing Buckets

aws s3 ls

Creating a New Bucket

aws s3 mb s3://my-new-bucket

Uploading a File to a Bucket

aws s3 cp myfile.txt s3://my-new-bucket/

Downloading a File from a Bucket

aws s3 cp s3://my-new-bucket/myfile.txt ./

Listing Objects in a Bucket

aws s3 ls s3://my-new-bucket/

Deleting an Object from a Bucket

aws s3 rm s3://my-new-bucket/myfile.txt

Deleting a Bucket

aws s3 rb s3://my-new-bucket --force

(--force ensures the bucket is emptied before deletion.)


Syncing Data with an S3 Bucket

The sync command is useful for mirroring local directories and S3 buckets.

Syncing a Local Directory to a Bucket

aws s3 sync ./my-local-folder s3://my-new-bucket/

Syncing a Bucket to a Local Directory

aws s3 sync s3://my-new-bucket/ ./my-local-folder

Syncing Two Buckets

aws s3 sync s3://source-bucket s3://destination-bucket

Does Data Pass Through Your Machine? Yes, when syncing two buckets via the AWS CLI, the data first transfers to the local machine before being uploaded to the destination bucket. To avoid this and perform a direct bucket-to-bucket transfer, use AWS SDKs or AWS DataSync.


Few words at the end

S3 provides a powerful, scalable, and secure storage solution compared to traditional file systems. With the AWS CLI, managing buckets and objects is straightforward, allowing efficient file transfers and synchronization. Understanding these fundamental operations will help streamline data workflows in the cloud.

For more details, refer to the AWS S3 Documentation.